24
24
import static org .mockito .BDDMockito .given ;
25
25
import static org .mockito .BDDMockito .then ;
26
26
import static org .mockito .BDDMockito .willAnswer ;
27
+ import static org .mockito .BDDMockito .willCallRealMethod ;
27
28
import static org .mockito .BDDMockito .willReturn ;
28
29
import static org .mockito .Mockito .atLeastOnce ;
29
30
import static org .mockito .Mockito .mock ;
@@ -314,7 +315,7 @@ private byte[] header(boolean isKey, DeserializationException deserEx) {
314
315
return baos .toByteArray ();
315
316
}
316
317
317
- @ SuppressWarnings ({"unchecked" , "rawtypes" })
318
+ @ SuppressWarnings ({ "unchecked" , "rawtypes" })
318
319
@ Test
319
320
void allOriginalHeaders () {
320
321
KafkaOperations <?, ?> template = mock (KafkaOperations .class );
@@ -334,7 +335,7 @@ void allOriginalHeaders() {
334
335
assertThat (headers .lastHeader (KafkaHeaders .DLT_ORIGINAL_TIMESTAMP_TYPE )).isNotNull ();
335
336
}
336
337
337
- @ SuppressWarnings ({"unchecked" , "rawtypes" })
338
+ @ SuppressWarnings ({ "unchecked" , "rawtypes" })
338
339
@ Test
339
340
void dontAppendOriginalHeaders () {
340
341
KafkaOperations <?, ?> template = mock (KafkaOperations .class );
@@ -385,7 +386,7 @@ void dontAppendOriginalHeaders() {
385
386
assertThat (exceptionHeaders .hasNext ()).isFalse ();
386
387
}
387
388
388
- @ SuppressWarnings ({"unchecked" , "rawtypes" })
389
+ @ SuppressWarnings ({ "unchecked" , "rawtypes" })
389
390
@ Test
390
391
void appendOriginalHeaders () {
391
392
KafkaOperations <?, ?> template = mock (KafkaOperations .class );
@@ -824,13 +825,13 @@ void addHeaderFunctionsProcessedInOrder() {
824
825
ConsumerRecord <String , String > record = new ConsumerRecord <>("foo" , 0 , 0L , "bar" , null );
825
826
DeadLetterPublishingRecoverer recoverer = new DeadLetterPublishingRecoverer (template );
826
827
recoverer .setHeadersFunction ((rec , ex ) -> {
827
- return new RecordHeaders (new RecordHeader [] { new RecordHeader ("foo" , "one" .getBytes ()) });
828
+ return new RecordHeaders (new RecordHeader []{ new RecordHeader ("foo" , "one" .getBytes ()) });
828
829
});
829
830
recoverer .addHeadersFunction ((rec , ex ) -> {
830
- return new RecordHeaders (new RecordHeader [] { new RecordHeader ("bar" , "two" .getBytes ()) });
831
+ return new RecordHeaders (new RecordHeader []{ new RecordHeader ("bar" , "two" .getBytes ()) });
831
832
});
832
833
recoverer .addHeadersFunction ((rec , ex ) -> {
833
- return new RecordHeaders (new RecordHeader [] { new RecordHeader ("foo" , "three" .getBytes ()) });
834
+ return new RecordHeaders (new RecordHeader []{ new RecordHeader ("foo" , "three" .getBytes ()) });
834
835
});
835
836
recoverer .accept (record , new ListenerExecutionFailedException ("test" , "group" , new RuntimeException ()));
836
837
ArgumentCaptor <ProducerRecord > producerRecordCaptor = ArgumentCaptor .forClass (ProducerRecord .class );
@@ -861,12 +862,12 @@ void immutableHeaders() {
861
862
ConsumerRecord <String , String > record = new ConsumerRecord <>("foo" , 0 , 0L , "bar" , null );
862
863
DeadLetterPublishingRecoverer recoverer = new DeadLetterPublishingRecoverer (template );
863
864
recoverer .setHeadersFunction ((rec , ex ) -> {
864
- RecordHeaders headers = new RecordHeaders (new RecordHeader [] { new RecordHeader ("foo" , "one" .getBytes ()) });
865
+ RecordHeaders headers = new RecordHeaders (new RecordHeader []{ new RecordHeader ("foo" , "one" .getBytes ()) });
865
866
headers .setReadOnly ();
866
867
return headers ;
867
868
});
868
869
recoverer .addHeadersFunction ((rec , ex ) -> {
869
- return new RecordHeaders (new RecordHeader [] { new RecordHeader ("bar" , "two" .getBytes ()) });
870
+ return new RecordHeaders (new RecordHeader []{ new RecordHeader ("bar" , "two" .getBytes ()) });
870
871
});
871
872
recoverer .accept (record , new ListenerExecutionFailedException ("test" , "group" , new RuntimeException ()));
872
873
ArgumentCaptor <ProducerRecord > producerRecordCaptor = ArgumentCaptor .forClass (ProducerRecord .class );
@@ -876,4 +877,25 @@ void immutableHeaders() {
876
877
assertThat (KafkaTestUtils .getPropertyValue (headers , "headers" , List .class )).hasSize (12 );
877
878
}
878
879
880
+ @ SuppressWarnings ("unchecked" )
881
+ @ Test
882
+ void nonCompliantProducerFactory () throws Exception {
883
+ KafkaOperations <?, ?> template = mock (KafkaOperations .class );
884
+ ProducerFactory pf = mock (ProducerFactory .class );
885
+
886
+ willCallRealMethod ().given (pf ).getConfigurationProperties ();
887
+
888
+ given (template .getProducerFactory ()).willReturn (pf );
889
+ ListenableFuture <?> future = mock (ListenableFuture .class );
890
+ ArgumentCaptor <Long > timeoutCaptor = ArgumentCaptor .forClass (Long .class );
891
+ given (template .send (any (ProducerRecord .class ))).willReturn (future );
892
+ given (future .get (timeoutCaptor .capture (), eq (TimeUnit .MILLISECONDS ))).willThrow (new TimeoutException ());
893
+ ConsumerRecord <String , String > record = new ConsumerRecord <>("foo" , 0 , 0L , "bar" , null );
894
+ DeadLetterPublishingRecoverer recoverer = new DeadLetterPublishingRecoverer (template );
895
+ recoverer .setFailIfSendResultIsError (true );
896
+ assertThatThrownBy (() -> recoverer .accept (record , new RuntimeException ()))
897
+ .isExactlyInstanceOf (KafkaException .class );
898
+ assertThat (timeoutCaptor .getValue ()).isEqualTo (Duration .ofSeconds (125 ).toMillis ());
899
+ }
900
+
879
901
}
0 commit comments