在 Apache Camel 应用程序中,单元测试如何注入模拟端点来代替真实端点?
In an Apache Camel application, how can unit tests inject mock endpoints in place of real ones?
我正在使用 Apache Camel 实现 message translator pattern,以使用来自 RESTful 端点的消息并将它们转发到 AMQP 端点。
封闭的应用程序基于 Spring Boot,因此我使用 Camel 的“spring-boot”组件来集成这两个框架。正如 spring-boot link 中的文档所建议的那样,我在扩展 RouteBuilder
的 @Configuration
-注释 class 中实现了我的 Camel 路由:
@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");
}
}
我的问题涉及如何在不需要实际的 RESTful 端点或已配置的 RabbitMQ 代理的情况下对该转换进行单元测试?我已经阅读了很多在线示例,以及 Camel in Action 一书......似乎对 Camel 路由进行单元测试的典型方法是剪切-粘贴路由到您的单元测试中,并将一个或多个端点 URL 替换为“mock:whatever
”。
我想 sorta 可以工作...但是它非常脆弱,您的测试套件将无法识别后来有人在不更新单元测试的情况下更改了真实代码。
我尝试使用模拟来改编一些基于 Spring 的单元测试示例,如下所示:
@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 会从单元测试中获取这些端点 URLs,将它们注册为模拟...然后在真实代码尝试使用这些端点时使用模拟而不是真实端点URL秒。
但是,我不确定这是否可行。当我在单元测试中使用真实的 URL 时,我得到了 IllegalArgumentException
,因为你显然不能将 "real" 端点 URL 注入 MockEndpoint
实例(仅 URL 以“mock:
”为前缀)。
当我在单元测试中使用“mock:...
”端点 URL 时,它就没用了,因为没有任何东西将它与 [=45] 中的真实端点 URL 联系起来=] 正在测试中。所以真正的端点 URL 永远不会被覆盖。当执行真正的代码时,它只是像往常一样使用真正的端点(目标是能够在不依赖 RabbitMQ 的情况下进行测试)。
我是否遗漏了一些非常基本的东西?似乎有一种方法可以让单元测试像这样将伪造的路由注入 class 中,这样被测试的代码就可以从真实的端点切换到模拟的端点,甚至都没有意识到。或者,我想我可以重构我的代码,以便将匿名 Processor
提升为独立的 class... 然后我可以独立于路由对其翻译逻辑进行单元测试。但这似乎是一个不完整的测试。
一些指示你可以做什么。
关于测试的可以再看一遍Camel的书,注意使用advice with
还有mockEndpointsAndSkip
您还可以使用 stub
组件
或者在你的路由中使用 属性 占位符,然后将 uris 配置为 mock/stub 等用于测试,并使用真实的用于生产
我正在使用 Apache Camel 实现 message translator pattern,以使用来自 RESTful 端点的消息并将它们转发到 AMQP 端点。
封闭的应用程序基于 Spring Boot,因此我使用 Camel 的“spring-boot”组件来集成这两个框架。正如 spring-boot link 中的文档所建议的那样,我在扩展 RouteBuilder
的 @Configuration
-注释 class 中实现了我的 Camel 路由:
@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");
}
}
我的问题涉及如何在不需要实际的 RESTful 端点或已配置的 RabbitMQ 代理的情况下对该转换进行单元测试?我已经阅读了很多在线示例,以及 Camel in Action 一书......似乎对 Camel 路由进行单元测试的典型方法是剪切-粘贴路由到您的单元测试中,并将一个或多个端点 URL 替换为“mock:whatever
”。
我想 sorta 可以工作...但是它非常脆弱,您的测试套件将无法识别后来有人在不更新单元测试的情况下更改了真实代码。
我尝试使用模拟来改编一些基于 Spring 的单元测试示例,如下所示:
@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 会从单元测试中获取这些端点 URLs,将它们注册为模拟...然后在真实代码尝试使用这些端点时使用模拟而不是真实端点URL秒。
但是,我不确定这是否可行。当我在单元测试中使用真实的 URL 时,我得到了 IllegalArgumentException
,因为你显然不能将 "real" 端点 URL 注入 MockEndpoint
实例(仅 URL 以“mock:
”为前缀)。
当我在单元测试中使用“mock:...
”端点 URL 时,它就没用了,因为没有任何东西将它与 [=45] 中的真实端点 URL 联系起来=] 正在测试中。所以真正的端点 URL 永远不会被覆盖。当执行真正的代码时,它只是像往常一样使用真正的端点(目标是能够在不依赖 RabbitMQ 的情况下进行测试)。
我是否遗漏了一些非常基本的东西?似乎有一种方法可以让单元测试像这样将伪造的路由注入 class 中,这样被测试的代码就可以从真实的端点切换到模拟的端点,甚至都没有意识到。或者,我想我可以重构我的代码,以便将匿名 Processor
提升为独立的 class... 然后我可以独立于路由对其翻译逻辑进行单元测试。但这似乎是一个不完整的测试。
一些指示你可以做什么。
关于测试的可以再看一遍Camel的书,注意使用advice with
还有mockEndpointsAndSkip
您还可以使用 stub
组件
或者在你的路由中使用 属性 占位符,然后将 uris 配置为 mock/stub 等用于测试,并使用真实的用于生产