RabbitMQ 集成测试和线程

RabbitMQ Integration Test and Threading

我通过实现 MessageListener 接口和设置 SimpleMessageListenerContainer 编写了一个 RabbitMQ 消费者。当我手动测试它时,它运行良好。现在我想编写一个集成测试:

  1. 创建消息
  2. 将消息推送到我的 RabbitMQ 服务器
  3. 在我的 MessageListener 实现使用消息时等待
  4. 一旦一切都完成,测试就会做出一些断言

但是,由于我的 MessageListener 运行 在一个单独的线程中,这使得单元测试变得困难。在我的测试中使用 Thread.sleep 来等待 MessageListener 是不可靠的,我需要某种阻塞方法。

设置响应队列并使用 rabbitTemplate.convertSendAndReceive 是我唯一的选择吗?我想避免设置响应队列,因为它们不会在真实系统中使用。

有什么方法可以仅使用 rabbitTemplate.convertAndSend 完成此操作,然后以某种方式等待我的 MessageListener 接收消息并进行处理吗?理想情况下,我会想象这样的事情:

rabbitTemplate.convertAndSend("routing.key", testObject);
waitForListner() // Somehow wait for my MessageListener consume the message
assertTrue(...)
assertTrue(...)

我知道我可以直接将消息传递到我的 MessageListener 而无需连接到 RabbitMQ,但我希望测试整个系统(如果可能的话)。如果无法以合理干净的方式实现我的目标,我打算回退到那个解决方案。

有几种方法,最简单的方法是包装您的侦听器并传入一个 CountDownLatch,侦听器会倒计时,主测试线程使用

assertTrue(latch.await(TimeUnit.SECONDS));

您也可以传回收到的实际消息,以便验证它是否符合预期。

另见 integration test cases in the framework itself