我有一个监听器测试,我在一个并行线程中发布一条消息,并检查LatchCountDownAndCallRealMethodAnswer是否成功处理了所有。单独运行测试,它完美地工作,但是如果你一起运行所有其他测试,它会失败,因为它无法将计数器保持为零,但是监听器正常接收并处理了消息。有没有人有任何想法?
我的测试班
@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
答案 0 :(得分:1)
如果您使用相同的队列进行其他测试,则需要关闭每个测试的应用程序上下文,以便停止测试的侦听器。默认情况下,Spring Test框架会缓存应用程序上下文以供重用。这将导致其他测试"窃取"消息。
将@DirtiesContext
添加到使用@RabbitListener
的每个测试类,告诉测试框架关闭上下文。