我正在使用带有 Spring 的RabbitMQ构建一个应用程序:到目前为止一切都很好。为了定义单元测试,我使用了面向外部服务器的 JUnit。我想知道是否有一种方法可以模拟 RabbitMQ 服务器来执行测试,以及是否有多种方法,这是最好的方法。
我发现了一些帖子,但它们是在 2012 年甚至更早之前发布的……也许有一些更新、更简单、更有效的东西!
提前致谢
我正在使用带有 Spring 的RabbitMQ构建一个应用程序:到目前为止一切都很好。为了定义单元测试,我使用了面向外部服务器的 JUnit。我想知道是否有一种方法可以模拟 RabbitMQ 服务器来执行测试,以及是否有多种方法,这是最好的方法。
我发现了一些帖子,但它们是在 2012 年甚至更早之前发布的……也许有一些更新、更简单、更有效的东西!
提前致谢
我不会尝试模拟 RabbitMQ 服务器本身。相反,模拟您的发布方法、通道工厂等以模拟错误条件(当然还有快乐的路径)。例如,当您的FoozleEvent.publish
方法抛出一个时会发生什么IOError
?
我们在框架本身中广泛使用模拟进行测试;探索想法的测试。从侧面看还不错RabbitTemplate
,但是对侦听器容器的模拟涉及更多。
@Rule
但是,在某些情况下,需要进行真正的集成测试,在这种情况下,如果没有本地 rabbitmq 代理,我们会使用 JUnit来忽略测试。
为了在 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 配置提供的 ConnectionFactory 或 Spring-Boot 为您提供的 ConnectionFactory 来使用它:
@Configuration
@Import(AppConfiguration.class)
class TestConfiguration {
@Bean
ConnectionFactory connectionFactory() {
return new CachingConnectionFactory(new MockConnectionFactory());
}
}
希望这会有所帮助!