【发布时间】:2023-03-30 17:35:02
【问题描述】:
我知道 RabbitMQ 是用 Erlang 编写的,因此不能像我们使用 ActiveMQ JMS 代理那样嵌入到 JVM 中。
但实际上有些项目是用另一种语言完成的,可以很容易地嵌入到集成测试中。
例如,用 C++ 编写的 MongoDB 可以在 JVM 集成测试的上下文中轻松启动/停止: https://github.com/flapdoodle-oss/embedmongo.flapdoodle.de
还有人将其移植到 Java: https://github.com/thiloplanz/jmockmongo/
所以我只是想知道,当我的应用程序是用 Java 编写的,而其他技术是另一种语言(如用于 RabbitMQ 的 Erlang)时,我们如何进行集成测试?
一般来说,有哪些好的做法?
我看到了 3 个主要解决方案:
- 启动一个真正的 RabbitMQ
- 在当前使用的语言中嵌入技术的 JVM 端口
- 使用标准技术,以便 Erlang 中的一种技术可以具有与 Java 中的另一种技术相同的行为和通信层(RabbitMQ / Qpid / StormMQ 实现 AMQP)
是否有用于启动临时 RabbitMQ 代理的 Maven/Sbt/Ant 插件? 有没有在测试课前支持 Junit/TestNG RabbitMQ 的项目?
我看到有一个 AMQP 在 Java 中的开源实现:Apache Qpid 在生产中有 RabbitMQ 时,有人有使用此实现进行集成测试的经验吗?甚至可能吗? 我正在使用 Spring 集成。
顺便说一句,我刚刚注意到 Spring-AMQP 项目在其 github 自述文件中提到:
这里的许多“集成”测试需要一个正在运行的 RabbitMQ 服务器 - 如果没有检测到代理,它们将被跳过。
【问题讨论】:
-
我在另一个 JVM 项目中使用 Apache Qpid 的经历确实令人失望。虽然以这种方式启动 Apache Qpid 是可能的,但它并不是为这样工作而设计的。 QPid 在运行时重新配置了整个应用程序日志框架(SLF4J + Logback)以满足自己的需求,并且不容易恢复这种变化。在我们的案例中,我们严重依赖 RabbitMQ 的扩展,因此不再追求这条道路没有意义。
标签: java mongodb jvm rabbitmq amqp