我正在编写一些使用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)”一起使用,所有这一切都将得到解决。但是我找不到一个。
答案 0 :(得分:0)
评论确实是一个很好的评论。 Camel提供了一个具有良好断言和验证的测试框架。所以我建议使用它。
然后,关于线程中的异常,诀窍通常是使用Thread.setUncaughtExceptionHandler
来捕获它们。
但是,确实,在你的情况下,camel可能正在使用自己的错误系统。我不记得什么是默认值,但您可能希望以特定方式管理异常。
最后,你使用了一个漂亮的模拟器吗?
因为如果没有调用预期的方法,EasyMock中的默认模拟应该在verify
上抛出错误。这就是为什么你真的不需要none