Reputation: 1
I have this test class in intellij, with multiple test cases when i run them individually they pass but not when run all at once
package com.comp.pnp.pgs.ab.topology.bolts;
import com.comp.pnp.pgs.ab.topology.config.SidelineFailTupleKafkaBoltConfig;
import com.comp.pnp.pgs.ab.topology.kafka.SidelineFailTuplePublisher;
import com.comp.pnp.pgs.ab.topology.models.SidelineEvent;
import com.comp.pnp.pgs.ab.topology.models.SidelineMetaData;
import com.comp.pnp.pgs.commons.models.ListingPriceAnomalyRequest;
import com.google.inject.Injector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.tuple.Tuple;
import org.junit.Before;
import org.junit.Test;
import com.comp.pnp.commons.init.StormGuiceContext;
import org.mockito.*;
import java.util.HashMap;
import static com.comp.pnp.pgs.ab.topology.Constants.DYNAMIC_ANOMALY_KAFKA_EVENT;
import static com.comp.pnp.pgs.ab.topology.Constants.SIDELINE_METADATA;
import static org.mockito.Mockito.*;
public class SidelineFailTupleBoltTest {
@Mock
private OutputCollector outputCollector;
@Mock
private TopologyContext topologyContext;
@Mock
private SidelineFailTuplePublisher sidelineFailTuplePublisher;
@Mock
private SidelineFailTupleKafkaBoltConfig sidelineFailTupleKafkaBoltConfig;
@Mock
private Tuple tuple;
@Mock
private Injector injector;
private SidelineFailTupleBolt sidelineFailTupleBolt;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(injector.getInstance(SidelineFailTuplePublisher.class)).thenReturn(sidelineFailTuplePublisher);
StormGuiceContext.init(injector);
when(topologyContext.registerMeter(anyString())).thenReturn(null);
sidelineFailTupleBolt = new SidelineFailTupleBolt(sidelineFailTupleKafkaBoltConfig);
sidelineFailTupleBolt.prepare(new HashMap<>(), topologyContext, outputCollector);
Mockito.reset(sidelineFailTuplePublisher);
}
@Test
public void testExecuteSuccess() {
ListingPriceAnomalyRequest request = new ListingPriceAnomalyRequest();
SidelineMetaData metaData = new SidelineMetaData();
when(tuple.getValueByField(DYNAMIC_ANOMALY_KAFKA_EVENT)).thenReturn(request);
when(tuple.getValueByField(SIDELINE_METADATA)).thenReturn(metaData);
when(sidelineFailTuplePublisher.publish(any(SidelineEvent.class))).thenReturn(true);
sidelineFailTupleBolt.execute(tuple);
verify(outputCollector, times(1)).ack(tuple);
}
@Test
public void testExecuteFailure() {
ListingPriceAnomalyRequest request = new ListingPriceAnomalyRequest();
SidelineMetaData metaData = new SidelineMetaData();
when(tuple.getValueByField(DYNAMIC_ANOMALY_KAFKA_EVENT)).thenReturn(request);
when(tuple.getValueByField(SIDELINE_METADATA)).thenReturn(metaData);
when(sidelineFailTuplePublisher.publish(any(SidelineEvent.class))).thenReturn(false);
when(sidelineFailTuplePublisher.isRetryLimitExceeded(any(SidelineEvent.class))).thenReturn(false);
sidelineFailTupleBolt.execute(tuple);
verify(outputCollector, times(1)).fail(tuple);
}
@Test
public void testExecuteException() {
when(tuple.getValueByField(DYNAMIC_ANOMALY_KAFKA_EVENT)).thenThrow(new RuntimeException("Test Exception"));
sidelineFailTupleBolt.execute(tuple);
verify(outputCollector, times(1)).fail(tuple);
}
@Test
public void testExecuteCallsPushDataToSidelineKafka() {
ListingPriceAnomalyRequest request = new ListingPriceAnomalyRequest();
SidelineMetaData metaData = new SidelineMetaData();
SidelineEvent sidelineEvent = new SidelineEvent(request, metaData);
when(tuple.getValueByField(DYNAMIC_ANOMALY_KAFKA_EVENT)).thenReturn(request);
when(tuple.getValueByField(SIDELINE_METADATA)).thenReturn(metaData);
when(sidelineFailTuplePublisher.publish(sidelineEvent)).thenReturn(true);
sidelineFailTupleBolt.execute(tuple);
verify(outputCollector, times(1)).ack(tuple);
}
}
getting the following error
Wanted but not invoked: outputCollector.fail(tuple); -> at com.comp.pnp.pgs.ab.topology.bolts.SidelineFailTupleBoltTest.testExecuteFailure(SidelineFailTupleBoltTest.java:86)
However, there were other interactions with this mock: outputCollector.ack(tuple); -> at com.comp.pnp.pgs.ab.topology.bolts.SidelineFailTupleBolt.execute(SidelineFailTupleBolt.java:54)
even when i mock the response when(sidelineFailTuplePublisher.publish(sidelineEvent)).thenReturn(false); to return false it is returning true. i think it is due to data leak between the test cases. so i have tried mock.reset() for all mocks. and an @After method to reset the mocks. nothing worked
Upvotes: 0
Views: 31