Junit 从RabbitMQ运行带有LatchCountDownAndCallRealMethodAnswer的测试时发生断言错误
我有一个监听器测试,我在一个并行线程中发布一条消息,并使用LatchCountdown和CallRealMethodAnswer检查是否成功处理了所有消息。单独运行测试,它工作得很好,但是如果同时运行所有其他测试,它会失败,因为它没有将计数器保留为零,但是侦听器正常接收并处理消息。有人有什么想法吗 我的测试班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
@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。