【发布时间】:2015-03-21 20:35:24
【问题描述】:
我通过实现 MessageListener 接口并设置 SimpleMessageListenerContainer 编写了一个 RabbitMQ 消费者。当我手动测试它时它运行良好。现在我想编写一个集成测试:
- 创建消息
- 将消息推送到我的 RabbitMQ 服务器
- 等待消息被我的 MessageListener 实现使用
- 测试完成后会做出一些断言
但是,由于我的 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,但如果可以的话,我希望测试整个系统。如果无法以相当干净的方式实现我的目标,我计划退回到该解决方案。
【问题讨论】:
标签: spring-amqp