JMS的集成测试

Integration testing of JMS

我有一套集成测试,它为我的应用程序创建了完整的 Spring 上下文,模拟了其他应用程序的端点并运行测试,例如调用 REST 服务,然后检查结果在数据库中,其他 web/REST-services 已被调用,依此类推。

我想测试的案例之一是使用 Spring 集成来完成 JMS 消息。对于这些测试用例,我创建了一个内存中的 ActiveMQ 代理,在其上放置一条消息,并检查消息的使用是否具有所需的结果。这种方法有一个问题,我找不到很好的解决方案。

由于消息处理发生在与我的测试执行分开的线程中,我必须等待一段时间才能验证行为。现在我通过 Thread.sleep 来完成此操作,但我对此并不十分满意。首先,它会增加构建时间,其次,如果设置得太低,则容易出现随机错误。这导致这些测试中的每一个都休眠 2 秒以确保安全。

有什么方法可以控制消息是否已被处理?也许有一种通过 JmsTemplate 检查 ActiveMQ 代理的方法?

想通了:

像这样:

Boolean messageWaiting = true;
while (messageWaiting) {
    messageWaiting =
         jmsTemplate.browse(myQueue,
                           (session, browser) -> browser.getEnumeration().hasMoreElements());
}

使用这个而不是线程睡眠,它似乎等待足够长的时间来消耗消息,但不会更长。