RabbitMQ集成测试和线程

Ry *_*wry 7 spring-amqp

我通过实现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(...)
Run Code Online (Sandbox Code Playgroud)

我知道我可以直接将消息传递给我的MessageListener而根本不连接到RabbitMQ,但我希望能够测试整个系统是否可以这样做.如果没有办法以合理清洁的方式实现我的目标,我计划回归到那个解决方案.

Gar*_*ell 4

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

assertTrue(latch.await(TimeUnit.SECONDS));
Run Code Online (Sandbox Code Playgroud)

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

另请参阅框架本身中的集成测试用例

  • @GaryRussell 如果您有一个现有的 Listener 类并且您想避免添加仅用于测试的“CountDownLatch”怎么办?在这种情况下,是否有集成测试的解决方法? (2认同)