【问题标题】:EasyMock assertion exception swallowed by threadEasyMock 断言异常被线程吞噬
【发布时间】:2015-11-19 14:49:09
【问题描述】:

我正在为一些使用 Apache Camel 路由和 Spring 注入端点处理程序的遗留代码编写单元测试。这在生产中效果很好,但对于使用 EasyMock 进行单元测试时会出现问题,因为 Apache Camel 是多线程的,并且会吞下来自 EasyMock 的 Unexpected method call 异常。

我很想使用模拟端点,但应用程序的可配置性不足以在不进行重构的情况下做到这一点。我想在进行重构之前进行测试。

基本上我的路线大致如下:

from("direct:input")
  .to("bean:validatorService?method=validate(${header},${body})")
  .choice()
    .when(body().isNotNull())
      .to("bean:processingService?method=continueProcessing(${header},${body})")
  .end()

现在我像往常一样设置单元测试,并使用 EasyMock 创建一个“validatorService”bean。这对肯定的情况很有用,我可以使用 EasyMock 来期望 validatorService.validate 被调用一次。但是,如果接下来调用 processingService.continueProcessing,我不会得到 EasyMock 异常。我的猜测是骆驼在另一个线程中吞下了异常(这个猜测与我查看的骆驼调试日志一致)。

这是一个按预期工作的测试,两种方法都应该被调用: EasyMock.reset(mockedValidator, mockedProcessor);

EasyMock.expect(mockedValidator.validate(
    EasyMock.anyObject(), EasyMock.anyObject()))
        .andReturn("foo").once();

// This method is called, the test passes regardless of whether
// or not the expectation is set because Camel swallows the exception.  
//EasyMock.expect(mockedProcessor.continueProcessing(
//    EasyMock.anyObject(), EasyMock.anyObject()).once();

EasyMock.replay(mockedValidator, mockedProcessor);

inputProducer.sendBody("message");

verify(mockedValidator, mockedProcessor);

如果有一个“none()”与“once()”和“times(N)”一起使用,所有这些都将得到解决。但是我找不到。

【问题讨论】:

  • 使用允许模拟端点的 Camel 测试支持代替 EasyMock。
  • 我也有同样的问题。很好的评论,但是如果我需要模拟的不是端点,而是一个与 Camel 无关的 bean? Winder 的问题仍然存在。

标签: java spring unit-testing apache-camel easymock


【解决方案1】:

评论确实是一个很好的评论。 Camel 提供了一个带有很好的断言和验证的测试框架。所以我建议使用它。

然后,关于线程中的异常,诀窍通常是使用Thread.setUncaughtExceptionHandler 来捕获它们。

但是,确实,就您而言,camel 可能正在使用自己的错误系统。我不记得默认值是什么,但您可能希望以特定方式管理异常。

最后,你用的是漂亮的模拟吗?

因为如果没有调用预期的方法,EasyMock 中的默认模拟应该在verify 上引发错误。这就是为什么你真的不需要none

【讨论】:

  • 问题不在于测试是否没有调用预期的方法。这和你描述的完全一样。它处理意外调用是个问题,因为 EasyMock 快速失败,但失败被埋没了。我将研究未捕获的异常处理程序,谢谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 2020-08-27
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多