RabbitMQ 集成测试和线程
RabbitMQ Integration Test and Threading
我通过实现 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,但我希望测试整个系统(如果可能的话)。如果无法以合理干净的方式实现我的目标,我打算回退到那个解决方案。
有几种方法,最简单的方法是包装您的侦听器并传入一个 CountDownLatch
,侦听器会倒计时,主测试线程使用
assertTrue(latch.await(TimeUnit.SECONDS));
您也可以传回收到的实际消息,以便验证它是否符合预期。
我通过实现 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,但我希望测试整个系统(如果可能的话)。如果无法以合理干净的方式实现我的目标,我打算回退到那个解决方案。
有几种方法,最简单的方法是包装您的侦听器并传入一个 CountDownLatch
,侦听器会倒计时,主测试线程使用
assertTrue(latch.await(TimeUnit.SECONDS));
您也可以传回收到的实际消息,以便验证它是否符合预期。