我有以下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);
}
}
我的想法:
创建扩展ServiceConfiguration
的testConfiguration
并传递。但是为此,我需要设置所有的配置,因为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);
}
替代@Mock
和MockitoAnnotations.initMocks
,只需使用:
serviceConfiguration = org.mockito.Mockito.mock(ServiceConfiguration.class);
当when
在createRouteBuilder
中被调用时,serviceConfiguration.getName()
总是为JUnit测试类中的所有测试方法返回相同的结果。如果不同的测试方法需要不同的uri,这可能是一个问题。
或者,您可以使用adviceWith
代替这里所描述的。
Camel有两种方法来进行路由测试,CamelSpringTestSupport和CamelTestSupport。
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。