假设我有一条像这样的apache camel路线:
from("direct:start")
.routeId("aRouteId")
.bean(someBusinnessTransformationBean).id("transformationBean")
.bean(aPersistenceBean).id("persistenceBean")
.to("direct:target");
然后,在我的单元测试中,我正在做类似的事情:
public class RouteTest extends CamelTestSupport {
@Override
public boolean isDumpRouteCoverage() { return true }
@Override
public boolean isUsedAdviceWith() { return true }
@EndpointInject(uri = "mock:mockTransformationBean")
protected MockEndpoint mockTransformationBean;
@EndpointInject(uri = "mock:mockPersistenceBean")
protected MockEndpoint mockPersistenceBean;
@Test
public void testRoute() throws Exception {
context.getRouteDefinition("aRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
weaveById("transformationBean")
.replace()
.multicast()
.to(mockTransformationBean);
weaveById("persistenceBean")
.replace()
.multicast()
.to(mockPersistenceBean);
}
});
context.start();
// Asserts the expectedMessageCount
// Send a message with template.sendBody...
assertMockEndpointSatisfied();
}
}
问题:
我怎样才能正确地测试这条路线,而不是仅仅确保messageCount和收到的主体(在第一个bean上)。
就像,我如何模仿MockEndpoint的响应,就像我在使用Mockito进行单元测试时所做的那样:
when(mockTransformationBean.someHandler(...)).thenReturn(anExpectedObjectForMyUnitTestPropose);
干杯,尼古拉斯
答案 0 :(得分:3)
经过一些研究,文档阅读等,我想出了一个可接受的解决方案:
weaveById("transformationBean")
.replace()
.to(mockTransformationBean)
.setBody(constant(<myExpectedMockResponse>));
所以稍后,我可以做一个断言:
mockPersistenceBean.expectedBodiesReceivedInAnyOrder(
<myExpectedMockResponse>
);
这样,不仅可以确保bean和端点是否正在接收正确的主体/标头,还可以确保路由之间的任何转换也正确。
因此,可以从单元的角度测试代码的输入和输出,而不是将其与单元测试中不需要的许多其他组件集成。
答案 1 :(得分:0)
您可以单独构建交换并调用bean方法;也就是说,不要通过Camel发送它们 - 只需直接调用bean。这是一个更有控制和有针对性的单元测试。