【问题标题】:JUnit Tests for RabbitMQRabbitMQ 的 JUnit 测试
【发布时间】:2023-04-08 14:03:01
【问题描述】:

我正在使用 RabbitMQ 和 Spring 构建应用程序:到目前为止一切顺利。 为了定义单元测试,我使用了面向外部服务器的 JUnit。 我想知道是否有一种方法可以模拟 RabbitMQ 服务器来执行测试,以及是否有多种方法,这是最好的方法。

我发现了一些帖子,但它们是在 2012 年甚至更早之前发布的……也许有一些更新、更简单、更有效的内容!

提前致谢

【问题讨论】:

    标签: java spring junit spring-amqp spring-rabbit


    【解决方案1】:

    我不会尝试模拟 RabbitMQ 服务器本身;相反,模拟您的发布方法、通道工厂等,以模拟错误条件(当然还有快乐的路径)。例如,当您的 FoozleEvent.publish 方法抛出 IOError 时会发生什么?

    【讨论】:

    • 我们选择了简单的解决方案来测试我们的业务逻辑方法,暂时不包括在模拟的 RabbitMQ 上的测试。感谢您的提示!
    • rabbitmq-mockrabbitmq-mock 可以为您完成所有这些嘲讽的繁重工作
    • @LoïcLeDoyen 不错!总是很高兴看到这样的工具开始出现。
    【解决方案2】:

    我们在框架本身中广泛使用模拟进行测试;探索tests 的想法。在RabbitTemplate 方面还不错,但对侦听器容器的模拟更多。

    但在某些情况下,需要进行真正的集成测试,在这种情况下,如果没有本地 rabbitmq 代理,我们会使用 JUnit @Rule 来忽略测试。

    【讨论】:

    • 感谢 Gary,目前我们决定只测试我们的内部服务,切断 RabbitMQ 集成,但是感谢您的指示,现在我对如何执行测试有了更好的了解!谢谢!
    • 感谢您的提示,所以您说您只在发送端进行测试,而不是在 RabbitListener 端进行测试。在这种情况下,您使用真实运行的 rabbitMQ 安装(使用 Rule)设置集成测试?如果您确实使用 RabbitListener 进行测试,是否有任何代码可以做到这一点?以及如何确保它不被直接使用,即你想用测试用例检查 RabbitListener 端的消息,即不能被测试用例外的普通 RabbitListener 事先使用。
    • 你真的应该问一个新问题。不,我们在消费者端也有模拟测试,但它非常复杂,需要一些框架内部知识。正如我所说,探索listener 包中的框架测试。在使用 @Rule(现在在 spring-rabbit-junit jar - 自 1.7 中提供)Documentation here 执行集成测试时,您可以使用不同的虚拟主机和/或队列名称。
    【解决方案3】:

    为了在 Java 世界中模拟 RabbitMQ,我正在构建一个库:rabbitmq-mock

    目的正是您描述的用例。您可以简单地替换 amqp-client ConnectionFactory,您将拥有开箱即用的大部分 RabbitMQ 功能,无需使用 IO(无需端口绑定)且无需启动时间。

    只需在 pom.xml 中添加依赖项:

    <dependency>
        <groupId>com.github.fridujo</groupId>
        <artifactId>rabbitmq-mock</artifactId>
        <version>1.0.14</version>
        <scope>test</scope>
    </dependency>
    

    然后您可以通过替换您通过 Spring 配置或 Spring-Boot 为您提供的 ConnectionFactory 来使用它:

    @Configuration
    @Import(AppConfiguration.class)
    class TestConfiguration {
        @Bean
        ConnectionFactory connectionFactory() {
            return new CachingConnectionFactory(new MockConnectionFactory());
        }
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2010-11-10
      • 2016-08-21
      • 2010-10-15
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多