gpt4 book ai didi

java - 在 Apache Camel 应用程序中,单元测试如何注入(inject)模拟端点来代替真实端点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:07 24 4
gpt4 key购买 nike

我正在实现 message translator pattern使用 Apache Camel,使用来自 RESTful 端点的消息并将它们发送到 AMQP 端点。

封闭的应用程序基于 Spring Boot,因此我使用 Camel 的“spring-boot”组件来集成这两个框架。正如这个 spring-boot 链接中的文档所建议的,我正在一个 @Configuration 中实现我的 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");

}

}

我的问题涉及如何对这种翻译进行单元测试,而不需要实际的 RESTful 端点或配置的 RabbitMQ 代理?我读过很多在线示例,以及《Camel in Action》一书……似乎对 Camel 路由进行单元测试的典型方法是将路由剪切-n-粘贴到您的单元测试,并将一个或多个端点 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 能够从单元测试中获取这些端点 URL,将它们注册为模拟……然后在真实代码尝试使用这些 URL 时使用模拟而不是真实端点。

但是,我不确定这是否可行。当我在单元测试中使用真实的 URL 时,我得到了 IllegalArgumentException,因为你显然不能将“真实的”端点 URL 注入(inject)到 MockEndpoint 实例中(只有 URLs前缀为“mock:”)。

当我在我的单元测试中使用“mock:...”端点 URL 时,它就没有用了,因为没有任何东西将它与被测类中的真实端点 URL 联系起来。因此,真正的端点 URL 永远不会被覆盖。当执行真正的代码时,它只是像往常一样使用真正的端点(目标是能够在不依赖 RabbitMQ 的情况下进行测试)。

我是否遗漏了一些非常基本的东西?似乎有一种方法可以让单元测试将伪造的路由注入(inject)到这样的类中,这样被测代码就可以在没有意识到的情况下从真实端点切换到模拟端点。或者,我想我可以重构我的代码,以便匿名 Processor 被提升为一个独立的类......然后我可以独立于路由对其翻译逻辑进行单元测试。但这似乎是一个不完整的测试。

最佳答案

一些指示你可以做什么。

关于测试的可以再看Camel的书,注意使用advice with

还有mockEndpointsAndSkip

你也可以使用stub组件

或者在你的路由中使用属性占位符,然后将 uris 配置为模拟/ stub 等用于测试,并使用真实的用于生产

关于java - 在 Apache Camel 应用程序中,单元测试如何注入(inject)模拟端点来代替真实端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com