我通过实现MessageListener接口并设置SimpleMessageListenerContainer来编写RabbitMQ使用者。当我手动测试时,它运行良好。现在我想编写一个集成测试:
但是,由于我的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,但我希望能够测试整个系统是否可以这样做。如果没有办法以合理干净的方式实现我的目标,我打算回到那个解决方案。
答案 0 :(得分:4)
有几种方法,最简单的方法是包装你的监听器并传入一个由监听器倒计时的CountDownLatch
,主测试线程使用
assertTrue(latch.await(TimeUnit.SECONDS));
您还可以传回收到的实际邮件,以便验证它是否符合预期。