【问题标题】:JMS dependencies in unit tests单元测试中的 JMS 依赖项
【发布时间】:2011-02-05 06:21:53
【问题描述】:

我有一个想要在 JUnit 中运行的给定测试。它依赖于代码使用 JMS 调用的复杂服务,因此在运行 JUnit 测试时它将无法访问它。那么,考虑到我需要调用此服务这一事实,那么在运行 JUnit 测试时调用此服务以使其仅返回硬编码响应的最佳方法是什么?

现在它使用 JNDI 来查找队列,现在使用 easymock 可以正常工作,因此 spring 初始化没有问题。但它现在需要从存根服务的回复队列中获得响应(非常重要)。

【问题讨论】:

  • 是同步调用还是异步调用?
  • 尝试将被测代码与服务隔离是否值得?
  • @Romain Hppeau:它是同步的。虽然这种担忧是普遍存在的,但我想说这并不重要。

标签: java unit-testing spring junit jms


【解决方案1】:

您是否考虑过在单元测试中使用嵌入式 ActiveMQ?

http://activemq.apache.org/how-to-unit-test-jms-code.html

【讨论】:

  • 这并没有讨论如何注入你自己的存根服务。除非我得到有效的回复,否则我的单元测试不会按照我想要的方式工作。一个有效的响应可能只是一个硬编码的 XML 字符串。
【解决方案2】:

应该如何将响应传递到回复队列?我假设它是通过在某处调用特定的回调方法来实现的。谁有权使用该方法?

如果回复队列被传递给存根服务,您可以通过 EasyMock 捕获它,然后直接调用它的方法。在the EasyMock documentation 中非常简要地讨论了这样做的方法(搜索“捕获”)。一个简单的例子:

Capture<Queue> replyQueueCapture = new Capture<Queue>();
...
MessageService stubService = createMock(MessageService.class);
stubService.sendMessage(capture(replyQueueCapture));
...
// run the test which indirectly invokes the stub service
...
Queue replyQueue = replyQueueCapture.getValue();
replyQueue.offer(replyMessage);

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多