如何在骆驼中对这个路由构建器进行单元测试



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

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);
    }
}

我的想法:

创建扩展ServiceConfigurationtestConfiguration并传递。但是为此,我需要设置所有的配置,因为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());
    }
}

当您使用@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);

whencreateRouteBuilder中被调用时,serviceConfiguration.getName()总是为JUnit测试类中的所有测试方法返回相同的结果。如果不同的测试方法需要不同的uri,这可能是一个问题。

或者,您可以使用adviceWith代替这里所描述的。

Camel有两种方法来进行路由测试,CamelSpringTestSupportCamelTestSupport

CamelSpringTestSupport

你可以用camel-whatever-test.xml设置路由,以便在Spring配置xml中设置路由。

CamelTestSupport

你可以用RouteBuilder createRoute来设置路由。并使用模拟组件配置端点。

这里是一些参考链接,不要忘记添加依赖jar:http://camel.apache.org/testing.html

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

另一方面,这是一个不好的信号,您需要它来设置配置数据。你应该检查你的配置是否可以被分割成单独的部分,或者根本不要在RouteBuilder中使用。如果您在代码的所有部分都使用一个配置结构,那么您就在应该分开的内容之间创建了紧密耦合。如果你只需要在routebuilder中使用queue uri和http uri这两个属性,那么可以考虑为它们设置两个setter。

相关内容

  • 没有找到相关文章

最新更新