1818
1919import static org .assertj .core .api .Assertions .assertThat ;
2020import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
21+ import static org .mockito .Mockito .inOrder ;
2122import static org .mockito .Mockito .mock ;
23+ import static org .mockito .Mockito .times ;
2224
23- import java .util .Collections ;
25+ import java .util .Arrays ;
2426import java .util .List ;
2527import java .util .concurrent .atomic .AtomicReference ;
2628
2729import org .apache .kafka .clients .consumer .Consumer ;
2830import org .apache .kafka .clients .consumer .ConsumerRecord ;
31+ import org .apache .kafka .common .TopicPartition ;
2932import org .junit .jupiter .api .Test ;
33+ import org .mockito .InOrder ;
3034
3135import org .springframework .kafka .KafkaException ;
3236import org .springframework .kafka .support .serializer .DeserializationException ;
@@ -42,19 +46,25 @@ public class SeekToCurrentErrorHandlerTests {
4246 public void testClassifier () {
4347 AtomicReference <ConsumerRecord <?, ?>> recovered = new AtomicReference <>();
4448 SeekToCurrentErrorHandler handler = new SeekToCurrentErrorHandler ((r , t ) -> recovered .set (r ));
45- ConsumerRecord <String , String > record = new ConsumerRecord <>("foo" , 0 , 0L , "foo" , "bar" );
46- List <ConsumerRecord <?, ?>> records = Collections .singletonList (record );
49+ ConsumerRecord <String , String > record1 = new ConsumerRecord <>("foo" , 0 , 0L , "foo" , "bar" );
50+ ConsumerRecord <String , String > record2 = new ConsumerRecord <>("foo" , 0 , 1L , "foo" , "bar" );
51+ List <ConsumerRecord <?, ?>> records = Arrays .asList (record1 , record2 );
4752 IllegalStateException illegalState = new IllegalStateException ();
53+ Consumer <?, ?> consumer = mock (Consumer .class );
4854 assertThatExceptionOfType (KafkaException .class ).isThrownBy (() -> handler .handle (illegalState , records ,
49- mock ( Consumer . class ) , mock (MessageListenerContainer .class )))
55+ consumer , mock (MessageListenerContainer .class )))
5056 .withCause (illegalState );
5157 handler .handle (new DeserializationException ("intended" , null , false , illegalState ), records ,
52- mock ( Consumer . class ) , mock (MessageListenerContainer .class ));
53- assertThat (recovered .get ()).isSameAs (record );
58+ consumer , mock (MessageListenerContainer .class ));
59+ assertThat (recovered .get ()).isSameAs (record1 );
5460 handler .addNotRetryableException (IllegalStateException .class );
5561 recovered .set (null );
56- handler .handle (illegalState , records , mock (Consumer .class ), mock (MessageListenerContainer .class ));
57- assertThat (recovered .get ()).isSameAs (record );
62+ handler .handle (illegalState , records , consumer , mock (MessageListenerContainer .class ));
63+ assertThat (recovered .get ()).isSameAs (record1 );
64+ InOrder inOrder = inOrder (consumer );
65+ inOrder .verify (consumer ).seek (new TopicPartition ("foo" , 0 ), 0L ); // not recovered so seek
66+ inOrder .verify (consumer , times (2 )).seek (new TopicPartition ("foo" , 0 ), 1L ); // 2x recovered seek next
67+ inOrder .verifyNoMoreInteractions ();
5868 }
5969
6070}
0 commit comments