【发布时间】:2019-04-07 18:41:46
【问题描述】:
场景: Junit 用于微服务,它监听队列并在数据提取后发布到 rabbitMQ 中的交换。
问题:
RabbitListenerTestHarness 正在为 Rabbit 创建模拟对象 仅侦听器类,正在实例化实际对象 监听器自动装配组件
我找不到手动将模拟 bean 注入侦听器的方法。这会导致 Junit 在 Junit 执行期间将测试消息发布到微服务中配置的实际队列。
解决方法:我可以使用 rabbit-test 项目的唯一方法是配置测试交换以在 Junit 执行期间发布消息。
查询: 我想了解,是否有更好的方式为 Rabbit Listener 编写 Junit。我还想了解是否有办法将模拟对象注入到 Rabbit Listeners 自动装配组件中。
示例代码片段:
兔子监听类
@RabbitListener(id = "id", bindings = @QueueBinding(value = @Queue(value = "sampleQueue", durable = "true", autoDelete = "false"),key = "sampleRoutingKey", exchange = @Exchange(value = "sampleExchange", durable = "true", ignoreDeclarationExceptions = "true", type = EXCHANGE_TYPE)))
public void getMessageFromQueue(@Payload EventModel event) throws ListenerExecutionFailedException, JAXBException {
dataExporterService.exportDataAndPostToRabbit(event);
}
服务类
@Autowired
DataExtractorRepository dataExtractorRepository;
@Autowired
DataPublihserRepository dataPublisherRepo;
public void exportDataAndPostToRabbit(EventModel event) throws JAXBException {
dataPublisherRepo.sendMessageToExchange(dataExtractorRepository.extractOrderData(event), exchangeName, routingKeyValue);
}
DataPublihserRepository 具有内部自动装配的 rabbitTemplate。 DataExtractorRepository 在内部连接到 DB 以检索消息。
测试类
@Autowired
private RabbitListenerTestHarness harness;
@Autowired
private RabbitTemplate rabbitTemplate;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
DataExporterController = this.harness.getSpy("id");
}
@Test
public void shouldReceiveMessage() throws Exception {
LatchCountDownAndCallRealMethodAnswer answer = new LatchCountDownAndCallRealMethodAnswer(1);
doAnswer(answer).when(DataExporterController).getMessageFromQueue(any(EventModel.class));
rabbitTemplate.convertAndSend("sampleExchange", "sampleRoutingKey", createMessage());
assertTrue(answer.getLatch().await(10, TimeUnit.SECONDS));
verify(DataExporterController, times(1)).getMessageFromQueue(any(OrderEventsModel.class));
verify(orderDataExporterController, times(1)).getMessageFromQueue(any(OrderEventsModel.class));
}
private Message createMessage() {
String inputObject = "{\"id\":12345}";
MessageProperties props = MessagePropertiesBuilder.newInstance().setContentType(MessageProperties.CONTENT_TYPE_JSON).build();
return new Message(inputObject.getBytes(), props);
}
【问题讨论】:
标签: java spring junit spring-amqp spring-rabbit