【问题标题】:How to unit test this route builder in camel?如何在骆驼中对这个路由构建器进行单元测试?
【发布时间】:2014-05-02 18:00:00
【问题描述】:

我有以下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());

    }
}

【问题讨论】:

    标签: unit-testing junit apache-camel mockito


    【解决方案1】:

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

    由于在createRouteBuilder 中调用whenserviceConfiguration.getName() 总是为 JUnit 测试类中的所有测试方法返回相同的结果。如果不同的测试方法需要不同的 URI,这可能是个问题。

    或者,您也可以使用adviceWith,如here 所述。

    【讨论】:

      【解决方案2】:

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

      CamelSpringTestSupport

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

      CamelTestSupport

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

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

      【讨论】:

      • 嗯。你没有回答问题。它是关于在使用依赖注入时测试路由构建器。
      • @dejavu,1.在camel-test.xml中注册routeBuilder,2.注册bean,3.CamelSpringTestSupport创建测试用例。
      【解决方案3】:

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

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

      【讨论】:

      • 我无法使用 mockito,因为一旦我创建了 TestRoute 的实例,就会自动调用 configure 方法。所以没有设置模拟对象和所有选项的选项。我也在使用dropwizard,所以只有一个配置文件。任何其他测试它的方法,或者您是否可以在这里告诉如何使用 mockito
      • 不确定你的意思。您如何创建 TestRoute 以及为什么要自动调用配置。如果您使用 CamelTestSupport,那么您可以在 createRouteBuilder 方法中创建 TestRoute。然后你可以在那里调用你的构造函数或设置器来设置必要的配置。
      • 查看问题中的编辑。我写了一个我正在使用的临时测试类。请建议。在camel中进行测试,是否需要在routebuilder中重新编写路径?或者我们可以通过调用实现的路由构建器来进行测试。但是一旦我创建了一个实例,就会自动调用 configure。
      • 您的测试看起来几乎没问题。只需手动创建 ServiceConfiguration 而不是使用@Mock。在创建路由的实例时不会调用 configure。当骆驼上下文出现时,骆驼测试支持会调用它。
      • 好的。那我应该嘲笑什么呢?那时我不知道在哪里使用mockito。对框架有点新意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多