docker - 如何在集成测试中等待某些操作
问题描述
嗨,我使用测试容器与 docker 进行了集成测试。在容器上我运行 jms。在测试中,我将消息放在队列中。
我如何在测试中等待以使其填充到 jms 上?
在本地机器上它可以工作,但在詹金斯它失败了,所以我必须添加
Thread.sleep(3000);
但这很讨厌。org.awaitility 似乎错过了用法:
await().atMost(2, TimeUnit.SECONDS).until(() -> return true));
我只需要暂停一下以使 jms 传播(放入 jms 队列)并等待侦听器采取行动,即将消息放入数据库。然后我必须调用 get rest 端点来查看它是否有效。
使用主题会更容易,因为我会在主题上创建测试监听器。但它是队列,可以有监听器来获取消息。
在此先感谢您的任何建议
解决方案
org.awaitility
与 JMS QueueBrowser一起使用,例如:
@Test
public void myTest() throws Exception {
...
await().atMost(2, TimeUnit.SECONDS).until(() -> return queueIsEmpty(queueName)));
...
}
private boolean queueIsEmpty(String queueName) {
ConnectionFactory cf = new MyBrokersConnectionFactory();
Connection connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
QueueBrowser browser = session.createBrowser(session.createQueue(queueName));
Enumeration enumeration = senderBrowser.getEnumeration();
while (enumeration.hasMoreElements()) {
return false;
}
return true;
}
AQueueBrowser
是只读的,因此不会有实际消耗消息的危险。
另一个可能的选择是创建一个带有事务会话的消费者,然后尝试接收消息。如果您确实收到了一条消息,您可以回滚事务并关闭消费者。
推荐阅读
- excel - VBA,如何打开新的excel实例
- angular - Angular 13 - 登录后菜单项不可见侧边栏组件
- bash - 等待使用任务集创建的流程完成
- php - 使用 Doxygen 将 PHP 源代码导出为 PDF
- sql - 如何摆脱oracle apex中丢失的左括号?
- android - Google Play 游戏服务是否使用 Android 广告 ID?
- numbers - tikz中数字的垂直对齐
- graphql - 更改查询变量时 Apollo 缓存未更新
- tensorflow - 如何在深度学习中手动拆分数据时评估模型?
- sharepoint - Sharepoint 阻止 xcallback-commands?