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());
}
使用这个而不是线程睡眠,它似乎等待足够长的时间来消耗消息,但不会更长。
我有一套集成测试,它为我的应用程序创建了完整的 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());
}
使用这个而不是线程睡眠,它似乎等待足够长的时间来消耗消息,但不会更长。