【发布时间】: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