Luca
Luca

Reputation: 1

test cases failing when run together, but pass when run individually

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

Answers (0)

Related Questions