从RabbitMQ使用LatchCountDownAndCallRealMethodAnswer运行测试时出现断言错误

时间:2017-07-03 19:24:25

标签: junit rabbitmq spring-cloud-stream spring-rabbit

我有一个监听器测试,我在一个并行线程中发布一条消息,并检查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

1 个答案:

答案 0 :(得分:1)

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

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