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