首页 > 解决方案 > 如何在集成测试中等待某些操作

问题描述

嗨,我使用测试容器与 docker 进行了集成测试。在容器上我运行 jms。在测试中,我将消息放在队列中。

我如何在测试中等待以使其填充到 jms 上?

在本地机器上它可以工作,但在詹金斯它失败了,所以我必须添加

    Thread.sleep(3000);

但这很讨厌。org.awaitility 似乎错过了用法:

await().atMost(2, TimeUnit.SECONDS).until(() -> return true));

我只需要暂停一下以使 jms 传播(放入 jms 队列)并等待侦听器采取行动,即将消息放入数据库。然后我必须调用 get rest 端点来查看它是否有效。

使用主题会更容易,因为我会在主题上创建测试监听器。但它是队列,可以有监听器来获取消息。

在此先感谢您的任何建议

标签: dockerjmsintegration-testingtestcontainersjms-queue

解决方案


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只读的,因此不会有实际消耗消息的危险。

另一个可能的选择是创建一个带有事务会话的消费者,然后尝试接收消息。如果您确实收到了一条消息,您可以回滚事务并关闭消费者。


推荐阅读