【问题标题】:Is there a way to use JMS in a JUnit test?有没有办法在 JUnit 测试中使用 JMS?
【发布时间】:2017-02-07 08:20:57
【问题描述】:

我想使用 JMS 运行 JUnit 测试。是否可以让 JUnit 测试在 JBoss 或 CDI 容器等应用程序服务器之外使用 JMS?

【问题讨论】:

  • 为什么投反对票?这是一个合理的问题
  • @chrisl08 答案很好。或者,您可以使用 嵌入式代理 来避免模拟。这样您就可以在没有任何存根或模拟的情况下测试组件/类之间的集成。它更接近现实生活。

标签: java junit jboss jms cdi


【解决方案1】:

您也可以重新考虑为此使用应用服务器 - Arquillian (http://arquillian.org) 允许在您选择的 JavaEE 环境中执行单元和集成测试 - 并自行管理应用服务器生命周期。

【讨论】:

  • 是的,您的回答很有价值,但 Arquillian 有其细微差别。它的设置非常复杂,它的本质是为每个测试创建“微部署”,测试执行时间很长等等......
  • 另外,问题确实明确指出“JUnit 测试在应用程序服务器之外使用 JMS”
  • 还有一个已知问题是 Arquillian 在测试完成后不释放资源。当您计划在 Jenkins 等持续部署环境中运行测试时,这个问题可能会成为一个大问题。
【解决方案2】:

如果消息的发送和消费与 JMS 完全解耦,您可以模拟它。

例如:您可以有一个实现类似“IMyClassSender”的接口的类。在实际代码(非 junit)中,该类所做的只是将消息提交给 JMS。在 junit 中,使用一个接受输入的类实现 IMyClassSender,如果提交给 JMS,它会将其传递给您的消费者类。

或者,如果您使用的是活动 mq:http://activemq.apache.org/how-to-unit-test-jms-code.html

【讨论】:

  • 这听起来像是一个可能的解决方案!嘲笑 JMS!关于activemq的问题,我需要将activemq库包含到项目中才能在JUnit中使用它?
  • 同样使用 ActiveMQ,我不需要 ActiveMQ 服务器运行吗?
  • 不是真的,因为您可以使用EmbeddedActiveMQBroker - 有关详细信息,请参阅答案中提供的链接。
  • 说实话,我从来没有使用过上面链接中描述的方法。我们总是使用“模拟”方法。我只是提供了它作为替代品
猜你喜欢
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多