在Apache Camel应用程序中,unit testing如何注入模拟端点来代替真实端点?

我正在使用Apache Camel实现消息转换器模式 ,以使用来自RESTful端点的消息并将它们发送到AMQP端点。

封闭的应用程序基于Spring Boot,因此我使用Camel的“ spring-boot ”组件来集成这两个框架。 正如这个spring-boot链接中的文档所示,我在@Configuration -annotated类中实现了我的Camel路由,该类扩展了RouteBuilder

 @Component public class MyRestToAmqpRouter extends RouteBuilder { @Override public void configure() throws Exception { from("jetty:http://my-restful-url") .process(exchange -> { // convert the message body from JSON to XML, take some // incoming header values and put them in the outgoing // body, etc... }).to("rabbitmq://my-rabbitmq-url"); } } 

我的问题涉及如何进行unit testing这个翻译,而不需要实际的RESTful端点或配置的RabbitMQ代理? 我已经阅读了许多在线示例,以及Camel in Action一书……看起来unit testingCamel路线的典型方法是将路线切入粘贴到unit testing中,并替换一个或更多端点URL与“ mock:whatever ”。

我猜这种方法很有用……但它非常脆弱,而且你的测试套件无法识别有人后来如何更改实际代码而不更新unit testing。

我试图使用模拟来修改一些基于Spring的unit testing示例,如下所示:

 @RunWith(CamelSpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {Application.class}) public class MyRestToAmqpRouterTest extends AbstractJUnit4SpringContextTests { @Produce(uri = "jetty:http://my-restful-url") private ProducerTemplate fakeRest; @EndpointInject(uri = "rabbitmq://my-rabbit-url") private MockEndpoint fakeRabbit; @Test @DirtiesContext public void testRouter() throws InterruptedException { fakeRabbit.expectedMessageCount(1); fakeRest.sendBodyAndHeader("", "header-1", "some value"); fakeRabbit.assertIsSatisfied(); } } 

我希望Camel会从unit testing中获取这些端点URL,将它们注册为模拟…然后在真实代码尝试使用这些URL时使用模拟而不是真实端点。

但是,我不确定这是可能的。 当我在unit testing中使用真实URL时,我得到了IllegalArgumentException ,因为你显然无法将“真正的”端点URL注入MockEndpoint实例(只有前缀为“ mock: ”的URL)。

当我在unit testing中使用“ mock:... ”端点URL时,它没用,因为没有任何东西可以将它绑定到被测试类中的真实端点URL。 这样就不会覆盖真正的端点URL。 当执行实际代码时,它只是正常使用真实端点(目标是能够在没有外部依赖RabbitMQ的情况下进行测试)。

我在这里错过了一些非常基本的东西吗? 似乎有一种方法可以让unit testing将假路由注入到这样的类中,这样被测代码就可以从真正的端点切换到模拟端点,甚至没有意识到。 或者,我想我可以重构我的代码,以便匿名Processor被提升到一个独立的类……然后我可以独立于路由unit testing其翻译逻辑。 但这似乎是一个不完整的测试。

一些指示你可能会做什么。

您可以再次阅读有关测试的Camel书籍,并注意使用建议

还有mockEndpointsAndSkip

您还可以使用stub组件

或者在路由中使用属性占位符,然后将uris配置为mock / stub等进行测试,并使用真实的生成器进行生产