Java ApacheMacleMockEndpoint模拟输出
假设我有一条apache camel路线,如下所示:Java ApacheMacleMockEndpoint模拟输出,java,unit-testing,mocking,apache-camel,Java,Unit Testing,Mocking,Apache Camel,假设我有一条apache camel路线,如下所示: from("direct:start") .routeId("aRouteId") .bean(someBusinnessTransformationBean).id("transformationBean") .bean(aPersistenceBean).id("persistenceBean") .to("direct:target"); 然后,在我的单元测试中,我做了如下工作: public clas
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和received body(在第一个bean上)
比如,当我使用Mockito进行单元测试时,如何模拟MockEndpoint的响应:
when(mockTransformationBean.someHandler(...)).thenReturn(anExpectedObjectForMyUnitTestPropose);
干杯,尼古拉斯经过一些研究、文档阅读等,我找到了一个可以接受的解决方案:
weaveById("transformationBean")
.replace()
.to(mockTransformationBean)
.setBody(constant(<myExpectedMockResponse>));
weaveById(“transformationBean”)
.替换()
.to(mockTransformationBean)
.setBody(常数());
因此,稍后,我可以执行如下断言:
mockPersistenceBean.expectedBodiesReceivedInAnyOrder(
<myExpectedMockResponse>
);
mockPersistenceBean.expectedBodiesReceivedInAnyOrder(
);
通过这种方式,不仅可以确保bean和端点是否接收到正确的主体/头,还可以确保路由之间的任何转换是否也正确完成
因此,可以从单元的角度测试代码的输入和输出,而不是将其与单元测试中不必要的许多其他组件集成 您可以单独构建交换并调用bean方法;也就是说,不要通过Camel发送,直接调用bean即可。这是一个更具控制性和针对性的单元测试。为什么不运行单元测试,然后将exchange主体与某个预期主体进行比较?因为我找不到一种方法来拦截具有apache端点的bean的exchange主体。我所能做的是确保接收到的主体到mock,但是,我想确保第一个bean转换主体,并将另一个主体发送到第二个bean。您可以在bean截获之后执行adviceWith并将其发送到mockendpoint。然后断言消息应该是什么。好吧,我明白了。我唯一感到困惑的是,如何确保所有编写的驼峰路线都正确编写?bean本身已经有了单元测试。但是,我如何确保稍后对代码进行维护的开发人员不会在不破坏bean的情况下破坏路由呢?那么,为什么不创建一个交换,并在单元测试中将交换或交换体发送到bean类,然后进行期望匹配呢。要测试整个路由,您需要运行路由并模拟外部依赖项。