Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheMacleMockEndpoint模拟输出_Java_Unit Testing_Mocking_Apache Camel - Fatal编程技术网

Java ApacheMacleMockEndpoint模拟输出

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

假设我有一条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和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类,然后进行期望匹配呢。要测试整个路由,您需要运行路由并模拟外部依赖项。