Junit 从RabbitMQ运行带有LatchCountDownAndCallRealMethodAnswer的测试时发生断言错误

Junit 从RabbitMQ运行带有LatchCountDownAndCallRealMethodAnswer的测试时发生断言错误,junit,rabbitmq,spring-cloud-stream,spring-rabbit,Junit,Rabbitmq,Spring Cloud Stream,Spring Rabbit,我有一个监听器测试,我在一个并行线程中发布一条消息,并使用LatchCountdown和CallRealMethodAnswer检查是否成功处理了所有消息。单独运行测试,它工作得很好,但是如果同时运行所有其他测试,它会失败,因为它没有将计数器保留为零,但是侦听器正常接收并处理消息。有人有什么想法吗 我的测试班 @RunWith(SpringRunner.class) @SpringBootTest @RabbitListenerTest @ActiveProfiles("test") publi

我有一个监听器测试,我在一个并行线程中发布一条消息,并使用LatchCountdown和CallRealMethodAnswer检查是否成功处理了所有消息。单独运行测试,它工作得很好,但是如果同时运行所有其他测试,它会失败,因为它没有将计数器保留为零,但是侦听器正常接收并处理消息。有人有什么想法吗

我的测试班

@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();
    }

}
错误

java.lang.AssertionError

如果有其他测试使用同一队列,则需要关闭每个测试的应用程序上下文,以便停止测试的侦听器。默认情况下,Spring测试框架缓存应用程序上下文以供重用。这将导致其他测试“窃取”消息


@DirtiesContext
添加到每个使用
@RabbitListener
s的测试类中,以告知测试框架关闭上下文。

即使我在其他测试中忘记了事件编辑器,这是否会影响此测试?事件发布者*我不确定“忘记”是什么意思。但是,如果您有其他测试,其中您使用的是与此测试使用相同队列的
@RabbitListener
,那么这些测试的容器(如果仍在运行)可能(很可能)会收到此测试的消息。您应该始终将
@DirtiesContext
添加到启动侦听器容器的任何测试用例中,以便在测试结束后停止容器。对不起,这是“模拟”的,不要忘记lol,translator很烂xd,但我理解它的工作原理,谢谢Gary。