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

2024-01-26

我正在实施一个消息翻译模式 http://camel.apache.org/message-translator.html使用 Apache Camel,使用来自 RESTful 端点的消息并将它们发送到 AMQP 端点。

封闭的应用程序基于 Spring Boot,因此我使用 Camel 的“弹簧靴 http://camel.apache.org/spring-boot.html“集成两个框架的组件。正如这个 spring-boot 链接中的文档所建议的,我正在一个内部实现我的 Camel 路由@Configuration-带注释的类扩展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 路由的典型方法是将路由剪切粘贴到单元测试中,并将一个或多个端点 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 注入到MockEndpoint实例(仅 URL 前缀为“mock:").

当我使用“mock:...“在我的单元测试中使用端点 URL,那么它就没用了,因为没有任何东西将它绑定到被测类中的真实端点 URL。因此,真实端点 URL 永远不会被覆盖。当执行真实代码时,它只是使用真实端点作为正常(目标是能够在不依赖 RabbitMQ 的外部依赖的情况下进行测试)。

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


一些提示你可以做什么。

你可以再读一遍Camel关于测试的书,注意使用advice

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

而且还有mockEndpointsAndSkip

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

您还可以使用stub成分

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

或者在路由中使用属性占位符,然后将 uri 配置为模拟/存根等以进行测试,并使用真实的进行生产

  • http://camel.apache.org/using-propertyplaceholder.html http://camel.apache.org/using-propertyplaceholder.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Apache Camel 应用程序中,单元测试如何注入模拟端点来代替真实端点? 的相关文章

随机推荐

  • 强制 Psych 将 YAML 映射读取为给定类的对象

    我有课Foo应该以最人性化的方式序列化为文本文件 我使用 Ruby 的默认 YAML Psych 和自定义encode with 我的问题是 如果我删除 ruby object Foo像这样 def encode with coder co
  • Azure Verizon CDN - 100% 缓存 CONFIG_NOCACHE

    几天前 我设置了 Azure Verizon Premium CDN 如下所示 Origin Azure Web 应用程序 NET MVC 5 网站 Settings 自定义域 无地理过滤 缓存规则 标准缓存 不关心参数 压缩 启用 优化用
  • 动态赋值给宏函数.pch文件和检查条件.pch文件

    pch 正如其名称所示 显示了预编译器标头 我在文件中定义了一个宏 以便应用程序可以在应用程序编译的一开始就决定 我需要的是 可以通过动态分配值来加载任何宏 例如NSUserDefaults并检查条件 pch文件本身 如果用户从屏幕 开关
  • Spring在运行时动态声明bean

    我想知道以下是否可能 出于测试目的 我希望在应用程序上下文中为不同的测试声明不同的模拟类 这些是使用 Jersey REST 客户端的验收测试 有没有办法在运行时动态声明bean Spring 是否有 API 允许在加载上下文后更改应用程序
  • Scala 异步/回调代码重写

    简单的代码应该通过检查用户 用户是否处于活动状态 然后更新上次登录日期时间 def authenticate Action async implicit request gt loginForm bindFromRequest fold e
  • C++ proc_open 模拟

    PHP 中有一个方便的函数 叫做proc open http php net manual ru function proc open php 它可用于调用可执行文件 打开其stdin stdout and stderr作为管道 这个函数在
  • 如何使用母版页在活动菜单项上设置 css 类?

    当我单击 ASP NET 母版页中的子菜单项或主项时 如何设置活动菜单项颜色 我的代码是 母版页源代码 ul class art menu li a href class span class l span span class r spa
  • GEKKO - 使用自定义目标函数进行参数估计 - 错误代码 -13

    我已经使用 Gekko 教程 线性和非线性回归 中介绍的相同技术成功地执行了稳态参数估计 下面是代码 coding utf 8 Spyder Editor This is a temporary script file from io im
  • WordPress:如何计算标签上的帖子数量

    我有个问题 如何计算某个标签的帖子数量 例子 标记照片 67 Thanks 使用下面的代码 taxonomy category can be category post tag or custom taxonomy name Using T
  • 单例类如何使用接口?

    我在很多地方读到单例可以使用接口 有些我无法理解这一点 每个类都可以实现一个接口 而 Singleton 只是一个 普通 类 它确保除了它可能实现的其他业务逻辑之外 在任何时间点都只存在它的一个实例 这也意味着 Singleton 至少有
  • 在 ColdFusion 中将文件保存到服务器

    经过一些研究后 我觉得这应该可行 但是它没有将文件保存到我的图像目录中
  • 消除 Ref# 参考不存在问题

    In the UpdateDemogInfoDA脚本中 我允许用户输入新信息 在另一个工作表 JBD 中捕获该信息 然后使用 示例数据 选项卡中的新信息覆盖旧信息 然后 当按下新的查找按钮时 将根据以下公式查找CustID填充 由于某种原因
  • 如何在 Bucardo Postgresql multi master 中处理序列

    我们正在三个不同的 Postgresql 服务器上设置一个数据库 将来可能会在更多服务器上 目前使用 bucardo 多主组同步所有表 我们不同步序列 我们尝试过 我们注意到当同时写入发生在不同服务器上的同一个表中时 布卡多会让我们丢失数据
  • 用户是否已经“喜欢”Facebook 帖子

    我已经尝试解决这个问题有一段时间了 并且慢慢意识到我拨打的电话并不是我想要的电话 我目前正在获取用户新闻源并添加一个 喜欢 按钮 但如果他们已经喜欢它 则应该说 不喜欢 我打电话给 me likes 并获得了一些数据 我通过比较新闻源中的每
  • 如何避免单元测试中的Thread.sleep?

    假设我有以下应该测试的方法 Autowired private RoutingService routingservice public void methodToBeTested Object objectToRoute initiali
  • WPF 图像源与 StringFormat 绑定

    我是 WPF 和 MVVM 的新手 本周开始尝试 并尝试在运行时绑定图像资源 我尝试显示的项目包含一个枚举属性 该属性指示项目的类型或状态 public class TraceEvent
  • 如何从服务器执行 GraphQL 查询

    我正在使用 graphql express 创建一个端点 我可以在其中执行 graphql 查询 虽然我将 Sequelize 与 SQL 数据库一起使用 但直接从 graphql 之外的服务器使用它感觉不对resolve功能 如何从定义它
  • VB 2010 - 具有标签名称值的变量

    我正在使用 VB 2010 Express 并且我的表单中有一个名为 lblTitle 的标签 下一个代码不起作用 我知道 但我该如何做这样的事情呢 Dim bla As String bla lblTitle bla Text Hello
  • 检查 Android 中的 VPN 连接是否处于活动状态?

    我的非 root Android 4 4 设备上有一个第三方 VPN 应用程序 并且想要编写一个后台服务来监视 VPN 连接并在 VPN 连接已断开时提醒用户 有没有办法做到这一点 我找不到任何使用 VPNService API 的方法 感
  • 在 Apache Camel 应用程序中,单元测试如何注入模拟端点来代替真实端点?

    我正在实施一个消息翻译模式 http camel apache org message translator html使用 Apache Camel 使用来自 RESTful 端点的消息并将它们发送到 AMQP 端点 封闭的应用程序基于 S