Java rabbitMQ的单元测试
我有一个将事件发布到RabbitMQ的应用程序和一个使用该事件的使用者。我的问题是有没有一种方法可以编写一个单元测试来测试这个消费者的功能Java rabbitMQ的单元测试,java,unit-testing,rabbitmq,Java,Unit Testing,Rabbitmq,我有一个将事件发布到RabbitMQ的应用程序和一个使用该事件的使用者。我的问题是有没有一种方法可以编写一个单元测试来测试这个消费者的功能 再加上这一点,消费者在层次结构中工作得更多,即,如果发布订单事件,当子订单被使用时,会提取其中的子订单并将其相应的事件发布到队列中。每个子订单中的行项目也会发布到队列中,最后每个行项目的详细信息都会发布到队列中。看起来,要想获得一个易于使用的解决方案来测试与RabbitMQ相关的开发,似乎还有很长的路要走达到 请参阅SpringFramework论坛的讨论和
再加上这一点,消费者在层次结构中工作得更多,即,如果发布订单事件,当子订单被使用时,会提取其中的子订单并将其相应的事件发布到队列中。每个子订单中的行项目也会发布到队列中,最后每个行项目的详细信息都会发布到队列中。看起来,要想获得一个易于使用的解决方案来测试与RabbitMQ相关的开发,似乎还有很长的路要走达到 请参阅SpringFramework论坛的讨论和讨论。他们要么使用Mockito(用于单元测试),要么使用真实的RabbitMQ实例(集成测试)进行自己的测试
此外,请参阅文章,作者使用了一个真正的RabbitMQ byt,并使用了一些工具来实现更“测试友好”的任务。但是,到目前为止,该解决方案仅对MAC用户有效 在前面答案的基础上,这里是单元测试路线的一个非常快速的实现(使用Mockito)。起点是RabbitMQ自己的java教程之一 接收方类(消息处理程序) 测试类
public class LocalConsumerTest {
Logger mockLogger = mock(Logger.class);
Channel mockChannel = mock(Channel.class);
String mockConsumerTag = "mockConsumerTag";
LocalConsumer _sut = new LocalConsumer(mockChannel, mockLogger);
@Test
public void shouldPrintOutTheMessage () throws java.io.IOException {
// arrange
String message = "Test";
// act
_sut.handleDelivery(mockConsumerTag, null, new AMQP.BasicProperties(), message.getBytes() );
// assert
String expected = " [x] Received and processed '" + message + "'";
verify(mockLogger).print(eq(expected));
}
}
消费者
public class LocalConsumer extends DefaultConsumer {
private Channel channel;
private Logger log;
// manual dependency injection
public LocalConsumer(Channel channel, Logger logger) {
super(channel);
this.log = logger;
}
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
// insert here whatever logic is needed, using whatever service you injected - in this case it is a simple logger.
log.print(" [x] Received and processed '" + message + "'");
}
}
// ...
// this is where you inject the system you'll mock in the tests.
Consumer consumer = new LocalConsumer(channel, _log);
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, consumer);
// ...
这篇文章描述了一个使用Qpid的解决方案