【问题标题】:Unit test on rabbitMQrabbitMQ的单元测试
【发布时间】:2014-01-03 17:18:10
【问题描述】:

我有一个将事件发布到 RabbitMQ 的应用程序和一个消费该事件的消费者。我的问题是有没有办法编写单元测试来测试这个消费者的功能。

补充一点,消费者更多地在层次结构中工作,即,如果发布订单事件,则提取其中的子订单,并在子订单被消费时将其相应事件发布到队列中,每个订单中的 lineItems 是也发布到队列,最后每个 lineItem 的详细信息将发布到。

【问题讨论】:

    标签: java unit-testing rabbitmq


    【解决方案1】:

    看起来,要找到一个易于使用的解决方案来测试 RabbitMQ 相关开发的方法还很遥远。

    请参阅 SpringFramework 论坛的 this 讨论和 this 讨论。他们要么使用 Mockito(用于单元测试),要么使用真实的 RabbitMQ 实例(集成测试)进行自己的测试。

    另外,请参阅this 帖子,作者使用真正的 RabbitMQ 字节和一些设施来完成更“测试友好”的任务。不过,目前该方案只对MAC用户有效!

    【讨论】:

    【解决方案2】:

    扩展上一个答案,这是单元测试路线的一个非常快速的实现(使用 Mockito)。起点是 RabbitMQ 自己的 java 教程之一。

    接收器类(消息处理程序)

    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 + "'");
        }
    }
    

    测试类

    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));
        }
    }
    

    消费者

        // ...
        // 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);
        // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      相关资源
      最近更新 更多