线程

时间:2015-11-19 14:49:09

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

我正在编写一些使用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异常。我的猜测是,camel吞下了另一个线程中的异常(这个猜测与我查看过的驼峰调试日志一致)。

这是一个按预期工作的测试,应该调用这两个方法:     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)”一起使用,所有这一切都将得到解决。但是我找不到一个。

1 个答案:

答案 0 :(得分:0)

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

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

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

最后,你使用了一个漂亮的模拟器吗?

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