Java RabbitMQ的JUnit测试

Java RabbitMQ的JUnit测试,java,spring,junit,spring-amqp,spring-rabbit,Java,Spring,Junit,Spring Amqp,Spring Rabbit,我正在使用带有Spring的RabbitMQ构建一个应用程序:到目前为止还不错。 为了定义单元测试,我正在使用JUnit来定位外部服务器。 我想知道的是,是否有一种方法可以模拟RabbitMQ服务器来执行测试,以及是否有多种方法,哪种方法是最好的 我在附近发现了一些帖子,但它们是在2012年或之前发布的。。。也许有更新、更简单、更有效的东西 提前感谢我不会试图嘲笑RabbitMQ服务器本身;相反,模拟发布方法、通道工厂等,以模拟错误条件(当然还有快乐路径)。例如,当您的FoozleEvent.p

我正在使用带有Spring的RabbitMQ构建一个应用程序:到目前为止还不错。 为了定义单元测试,我正在使用JUnit来定位外部服务器。 我想知道的是,是否有一种方法可以模拟RabbitMQ服务器来执行测试,以及是否有多种方法,哪种方法是最好的

我在附近发现了一些帖子,但它们是在2012年或之前发布的。。。也许有更新、更简单、更有效的东西


提前感谢

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

我们在框架本身的测试中广泛使用模拟;探索新的想法。在
rabbitmplate
方面还不算太糟糕,但对侦听器容器的模拟更为复杂


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

要在Java世界中模拟rabbitmq,我正在构建一个库:

目的正是您描述的用例。您只需更换amqp客户端
ConnectionFactory
,即可获得大多数RabbitMQ功能,无需使用IO(无需端口绑定)也无需启动时间

只需在您的pom.xml中添加依赖项即可:

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

希望这会有帮助

感谢Gary,我们决定只测试我们的内部服务,取消了RabbitMQ集成,但感谢您的指示,现在我对测试的执行方式有了更好的理解!谢谢谢谢你的提示,所以你是说你只是在发送端测试,而不是在RabbitListener端。在这种情况下,您是否使用实际运行的rabbitMQ安装(wih规则)设置集成测试?如果您确实使用RabbitListener进行测试,是否有代码执行此操作?你如何确保它没有被直接使用,也就是说,你想用测试用例检查RabbitListener端的消息,也就是说,不能被测试用例之外的普通RabbitListener提前使用。你真的应该问一个新问题。不,我们在用户端也有模拟测试,但它相当复杂,需要一些框架内部知识。正如我所说,在
listener
包中探索框架测试。使用
@Rule
执行集成测试时,您可以使用不同的虚拟主机和/或队列名称(现在在
spring rabbit junit
jar中提供,从1.7开始)。我们选择了测试业务逻辑方法的简单解决方案,暂时不包括模拟RabbitMQ上的测试。谢谢你的提示!“LoïcLeDoyen nice”可以帮你完成所有这些嘲弄性的繁重工作!总是很高兴看到像这样的工具开始出现。
@Configuration
@Import(AppConfiguration.class)
class TestConfiguration {
    @Bean
    ConnectionFactory connectionFactory() {
        return new CachingConnectionFactory(new MockConnectionFactory());
    }
}