unit-testing - 如何在 Camel 中对这个路由构建器进行单元测试?

标签 unit-testing junit apache-camel mockito

我有以下 RouteBuilder 类,我在这里使用依赖注入(inject)。我如何测试这个路由生成器?我正在使用 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);
    }
}

我的想法:

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

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

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。此外,在将引用传递给 TestRoute 之前,还调用了 when:

@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 中调用 时,serviceConfiguration.getName() 始终为 JUnit 测试类中的所有测试方法返回相同的结果.如果不同的测试方法需要不同的 URI,这可能是个问题。

或者,您可以使用 adviceWith 代替描述 here .

关于unit-testing - 如何在 Camel 中对这个路由构建器进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434232/

相关文章:

c# - 模拟 while 循环

c# - 运行单元测试时如何处理静态初始化?

c# - 单元测试多线程代码时出现问题

unit-testing - BDD Mockito - 使用参数捕获器时 verify(...) 的别名?

java - 字符串条件检查测试失败

javascript - Protractor:Jasmine-Reporter (jasmine2) 正在生成奇怪的 Junit XML 报告

java - 将测试名称作为参数传递

java - Camel如何拆分/迭代列表并单独发送到队列?

java - Apache Camel 中使用 beanref 代替 processref 的优点

exception - 如果在单独的类中定义了异常子句,则 Camel 异常处理将不起作用