|
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;
|
@@ -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 | + CompletableFuture<?> future = mock(CompletableFuture.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