如何在驼峰中对这条路线建造者进行单元测试?

时间:2014-05-02 18:00:01

标签: unit-testing junit apache-camel mockito

我有以下RouteBuilder类,我在这里使用依赖注入。如何测试此路径构建器?我正在使用JUnit和骆驼测试类。

public class TestRoute extends RouteBuilder {

    private ServiceConfiguration serviceConfiguration;

    public TestRoute(ServiceConfiguration serviceConfiguration) {
        this.serviceConfiguration = serviceConfiguration;
    }

    @Override
    public void configure() throws Exception {
        String incomingURI = serviceConfiguration.getQueueConfiguration().getURI();
        String outgoingURI = serviceConfiguration.getHTTPConfiguration().getURI();
        from(incomingURI).
        setHeader(Exchange.HTTP_METHOD, constant("PUT")).setHeader(Exchange.CONTENT_TYPE, constant("application/json")).
        to(outgoingURI);
    }
}

我的想法:

创建testConfiguration扩展ServiceConfiguration并传递它。但为此我需要设置所有配置,因为serviceConfiguration包含许多其他类。我可以在这里使用Mockito吗?测试这个的正确方法是什么?

编辑:我使用的是现有路线,因此我不必再写一遍。看起来这不是骆驼测试的正确方法。看我的测试课。当然,它不起作用。

public class RabbitMQRouteTest extends CamelTestSupport {

    @Mock
    ServiceConfiguration serviceConfiguration;

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        System.out.println("testing");
        return new TestRoute(serviceConfiguration);
    }
    @Test
    public void testConfigure() throws Exception {
        System.out.println("test");

        when(serviceConfiguration.getName()).thenReturn("file://target/inbox");

        template.sendBodyAndHeader("file://target/inbox", "Hello World",Exchange.FILE_NAME, "hello.txt");
        Thread.sleep(1000);
        File target = new File("target/outbox/hello.txt");
        assertTrue("File not moved", target.exists());

    }
}

3 个答案:

答案 0 :(得分:2)

当您使用@Mock时,必须调用MockitoAnnotations.initMocks。此外,在将引用传递给when

之前,还会调用TestRoute
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    // Initialize serviceConfiguration
    MockitoAnnotations.initMocks(this); 
    when(serviceConfiguration.getName()).thenReturn("file://target/inbox");
    return new TestRoute(serviceConfiguration);
}

除了@MockMockitoAnnotations.initMocks之外,只需使用:

serviceConfiguration = org.mockito.Mockito.mock(ServiceConfiguration.class);

when中调用createRouteBuilder时,serviceConfiguration.getName()始终为JUnit测试类中的所有测试方法返回相同的结果。如果不同的测试方法需要不同的URI,这可能是个问题。

或者,您可以使用adviceWith来代替here

答案 1 :(得分:1)

Camel有两种方法可以进行路由测试, CamelSpringTestSupport CamelTestSupport

<强> CamelSpringTestSupport

您可以使用一些camel-whatever-test.xml设置路由,以在Spring配置xml中设置路由。

<强> CamelTestSupport

您可以使用RouteBuilder createRoute设置路线。并使用模拟组件配置端点。

这里有一些参考链接,别忘了添加依赖jar: http://camel.apache.org/testing.html

答案 2 :(得分:0)

在您的情况下使用mockito是有意义的,因为您只需要ServiceConfiguration的一些小部分。

另一方面,您需要它来设置配置数据是一个不好的迹象。您应该检查您的配置是否可以拆分为单独的部分,或者根本不在RouteBuilder中使用。如果您有一个在代码的所有部分中使用的配置结构,则会在应该分开的事物之间建立紧密耦合。如果您只需要路由器中的两个属性队列uri和http uri,那么请考虑为它们设置两个setter。