Search code examples
junitrabbitmqspring-cloud-streamspring-rabbit

Assertion error while running test with LatchCountDownAndCallRealMethodAnswer from RabbitMQ


I have a listener test, where i post a message in a parallel thread and check with LatchCountDownAndCallRealMethodAnswer if the all were processed successfully. Running the test alone, it works perfectly, however if you run all other tests together, it fails because it failed to leave the counter at zero, but the listener received and processed the message normally. Does anyone have any ideas?

My Test Class

@RunWith(SpringRunner.class)
@SpringBootTest
@RabbitListenerTest
@ActiveProfiles("test")
public class EventListenerTest {

    EventListener eventListener;

    @Autowired
    protected RabbitListenerTestHarness harness;

    @Autowired
    private EventStoreRepository repository;

    @SpyBean
    private DomainEventPublisher publisher;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        DomainRegister.setDomainEventPublisher(publisher);
        eventListener = this.harness.getSpy("eventListenerId");
    }

    @Test
    public void storeEventsListenerTest() throws Exception {

        LatchCountDownAndCallRealMethodAnswer answer = new LatchCountDownAndCallRealMethodAnswer(1);
        doAnswer(answer).when(eventListener).storeEvents(any(BalanceReserved.class));

        publisher.publish(new BalanceReserved("12233", 150.0, BigDecimal.ZERO), "");

        assertTrue(answer.getLatch().await(10, TimeUnit.SECONDS));

        verify(eventListener, times(1)).storeEvents(any(BalanceReserved.class));
    }

    @After
    public void tearDown() {
        DomainRegister.setDomainEventPublisher(null);
        reset(eventListener);
        repository.deleteAll();
    }

}

Error

java.lang.AssertionError

Solution

  • If you have other tests using the same queue, you need to shut down the application context for each test so the test's listeners are stopped. By default, the Spring Test framework caches the application context for reuse. This will cause other tests to "steal" messages.

    Add @DirtiesContext to each test class that uses @RabbitListeners, to tell the test framework to shutdown the context.