package eu.europeana.cloud.service.dls.kafka; import eu.europeana.cloud.service.mcs.messages.AbstractMessage; import eu.europeana.cloud.service.mcs.messages.InsertRepresentationMessage; import java.util.Random; import kafka.serializer.DefaultEncoder; import org.apache.commons.lang.SerializationUtils; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value = { "classpath:/testKafkaMessageListener.xml" }) public class KafkaMessageListenerTest { @Autowired private MessageDispatcher messageDispatcher; @Autowired private KafkaMessageListener messageListener; public KafkaMessageListenerTest() { } private static final String TOPIC = "topic"; private static final int PARTITION = 0; private static final int OFFSET = 0; private final DefaultEncoder encoder = new DefaultEncoder(null); @Before public void setUp() { Mockito.reset(messageDispatcher); } @Test public void shouldSuccessfullyCallOnMessage() { // given final ArgumentCaptor<AbstractMessage> argument = ArgumentCaptor .forClass(AbstractMessage.class); final AbstractMessage message = new InsertRepresentationMessage("test"); final byte[] messageBytes = prepareCorrectMessageBytes(message); // when messageListener.onMessage(null, PARTITION, OFFSET, null, messageBytes); // then verify(messageDispatcher, times(1)).routeMessage(argument.capture()); Mockito.verifyNoMoreInteractions(messageDispatcher); assertEquals(message, argument.getValue()); } @Test public void shouldIgnoreNullMessageBytesOnMessage() { // given byte[] messageBytes = null; // when messageListener.onMessage(null, PARTITION, OFFSET, null, messageBytes); // then Mockito.verifyZeroInteractions(messageDispatcher); } @Test public void shouldIgnoreNullMsessageBytesOnMessage() { // given byte[] messageBytes = prepareCorrectMessageBytes(null); doThrow(new NullPointerException()).when(messageDispatcher) .routeMessage(null); // when messageListener.onMessage(null, PARTITION, OFFSET, null, messageBytes); // then verify(messageDispatcher, times(1)).routeMessage(null); Mockito.verifyNoMoreInteractions(messageDispatcher); } @Test public void shouldIgnoreMalformedMessageBytesOnMessage() { // given final byte[] messageBytes = new byte[20]; new Random().nextBytes(messageBytes); // when messageListener.onMessage(null, PARTITION, OFFSET, null, messageBytes); // then Mockito.verifyZeroInteractions(messageDispatcher); } private byte[] prepareCorrectMessageBytes(AbstractMessage message) { return encoder.toBytes(SerializationUtils.serialize(message)); } }