当前位置: 首页 > 知识库问答 >
问题:

在Apache Camel应用程序中,单元测试如何注入模拟endpoint来代替真实endpoint?

易和怡
2023-03-14

我用Apache Camel实现了一个消息转换器模式,使用来自RESTfulendpoint的消息,并将它们发送到AMQPendpoint。

随附的应用程序基于Spring启动,因此我使用Camel的“Spring启动”组件来集成这两个框架。正如此Spring启动链接中的文档所建议的那样,我正在扩展 RouteBuilder@Configuration注释类中实现我的 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");

   }

}

我的问题是,在不需要实际的RESTfulendpoint或配置的RabbitMQ代理的情况下,如何对这个翻译进行单元测试?我读过很多网上的例子,还有《骆驼行动》这本书...似乎单元测试Camel route的典型方法是将该路由剪切粘贴到单元测试中,并用“< code>mock:whatever”替换一个或多个endpointURL。

我想那是可行的...但是它非常脆弱,当有人在没有更新单元测试的情况下修改了真正的代码时,您的测试套件不会识别出来。

我试着用模拟来调整一些基于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();
    }

}

我希望骆驼能从单元测试中获取这些endpointURL,并将它们注册为模拟...然后在真实代码尝试使用这些 URL 时使用模拟而不是真正的终结点。

但是,我不确定这是否可能。当我在单元测试中使用真实 URL 时,我得到的是非法描述异常,因为您显然无法将“真实”endpoint URL 注入到 MockEndpoint 实例中(只有以“mock:”为前缀的 URL)。

当我使用“<代码>模拟:...“在我的单元测试中的endpointURL,那么它是无用的,因为没有任何东西将它与被测试类中真正的endpointURL联系起来。以便真正的endpointURL永远不会被覆盖。当执行真正的代码时,它只是像平常一样使用真正的endpoint(目标是能够在没有对RabbitMQ的外部依赖的情况下进行测试)。

我是不是遗漏了一些非常基本的东西?单元测试似乎有办法将假路由注入到这样的类中,这样被测试的代码就可以在没有意识到的情况下从真实endpoint切换到模拟endpoint。或者,我想我可以重构我的代码,这样匿名处理器就可以提升到一个独立的类……然后我可以独立于路由单元测试它的翻译逻辑。但这似乎是一个不完整的测试。

共有1个答案

百里骏
2023-03-14

一些指示你可以做什么。

你可以再读一次骆驼的书关于测试,并注意使用建议与

  • http://camel.apache.org/advicewith.html.

还有< code > mockEndpointsAndSkip

    < Li > http://camel . Apache . org/mock . html

您还可以使用stub组件

  • http://camel.apache.org/stub

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

  • http://camel.apache.org/using-propertyplaceholder.html
 类似资料:
  • 第一个问题:如何注入模拟(或真实?)HttpServletResponse在我对CXF JAX-RS服务endpoint进行单元测试期间? 我们的服务是如何设置的示例(注意我没有控制/权限来更改非测试结构): 测试类: 我可能在这里做错了几件事,但是我希望我只需要在我的自定义调用器中加入正确的“魔法”,以便正确地向我的endpoint注入HttpServlet响应。我要注意的是,在我没有注入上下文

  • 我有以下用例: 问题2:为什么如果我只使用构造函数而不使用@Autowired或者反之亦然,那么一切都能正常工作,因为我没有加载Spring上下文...我有单元测试...

  • 我的实现出了什么问题?谢谢

  • 问题内容: 我正在使用RestTemplate 方法发布到端点。在我的测试文件中,我正在测试POST方法。但是用我目前的测试,我得到了POST请求。在测试文件中发出POST请求时,我需要模拟API的帮助 这是我的主文件 这是我的测试文件 问题答案: 您正在测试DataTestRepo类内部的逻辑,因此您不应模拟它。RestTemplate是DataTestRepo内部的一个依赖项,因此这正是您需要

  • 我是NativeScript的新手,我刚刚制作了我的第一个应用程序。我的应用程序需要在真正的iPhone上进行测试;然而,我不知道如何在真正的iPhone上测试它,而不是在模拟器上。我试着查看appbuilder文档,但我不知道如何在iPhone上测试它。当我插上iPhone时,我试图使用,但我发现: 我不知道为什么我不能在iPhone上运行它。谁能告诉我如何在真正的iPhone上测试它,或者我做

  • 问题内容: 每当我想测试使用资源注入的类时,我最终都会包含一个仅在测试中使用的构造函数: 还有另一种模拟资源注入的方式,或者这是遵循的正确模式吗? 问题答案: 您可以使用简单的光泽效果,它可以模拟EJB注入系统。 另一种方法是在测试中使用反射来设置字段,我有时使用类似这样的内容: