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

Apache Camel MockEndpoint模拟输出

罗昊空
2023-03-14

假设我有一条这样的阿帕奇骆驼路线:

from("direct:start")
    .routeId("aRouteId")
    .bean(someBusinnessTransformationBean).id("transformationBean")
    .bean(aPersistenceBean).id("persistenceBean")
    .to("direct:target");

然后,在我的单元测试中,我做了这样的事情:

public class RouteTest extends CamelTestSupport {
    @Override
    public boolean isDumpRouteCoverage() { return true }

    @Override
    public boolean isUsedAdviceWith() { return true }

    @EndpointInject(uri = "mock:mockTransformationBean")
    protected MockEndpoint mockTransformationBean;

    @EndpointInject(uri = "mock:mockPersistenceBean")
    protected MockEndpoint mockPersistenceBean;

    @Test
    public void testRoute() throws Exception {
        context.getRouteDefinition("aRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                weaveById("transformationBean")
                    .replace()
                    .multicast()
                    .to(mockTransformationBean);

                weaveById("persistenceBean")
                    .replace()
                    .multicast()
                    .to(mockPersistenceBean);
            }
        });

        context.start();

        // Asserts the expectedMessageCount

        // Send a message with template.sendBody...

        assertMockEndpointSatisfied();
    }
}

问题:

我如何才能正确地对这个路由进行单元测试,而不是仅仅确保messageCount和received body(在第一个bean上)。

比如,如何模拟MockEndpoint的响应,就像使用Mockito进行单元测试时一样:

when(mockTransformationBean.someHandler(...)).thenReturn(anExpectedObjectForMyUnitTestPropose);

干杯尼古拉斯

共有2个答案

巫马承德
2023-03-14

您可以单独构建交换并调用bean方法;也就是说,不要通过Camel发送它们——直接调用bean。这是一个更受控制和更有针对性的单元测试。

黎鹤轩
2023-03-14

经过一些研究、文档阅读等等,我提出了一个可以接受的解决方案:

weaveById("transformationBean")
    .replace()
    .to(mockTransformationBean)
    .setBody(constant(<myExpectedMockResponse>));

所以以后,我可以像这样做断言:

mockPersistenceBean.expectedBodiesReceivedInAnyOrder(
    <myExpectedMockResponse>
);

这样,不仅可以确保bean和endpoint接收到正确的主体/头,还可以确保路由之间的任何转换也正确进行。

因此,可以从单元的角度测试代码的输入和输出,而不是将其与单元测试中不必要的许多其他组件集成。

 类似资料:
  • 问题内容: 我正在尝试用python制作文字游戏。但是一切顺利,我想创建一个函数,使我可以在终端上打印一些东西,但是戴着帽子看起来像打字。 目前我有: 输出为: 有没有办法消除字母之间的空格? 问题答案: 在Python2.x中,您可以使用代替: 在Python 3.x中,您可以将可选参数设置为空字符串:

  • 问题内容: 问题: 我希望能够 在Java中 以通用方式访问 Java对象的 任何属性/字段,就像动态语言(例如Groovy,JavaScript)一样。在编写此管道代码时,我不知道它是什么类型的对象或属性/字段名称是什么。但是当我使用它时,我将知道属性/字段名称。 我当前的解决方案: 到目前为止,我已经编写了一个简单的包装器类,该包装器类用于获取Bean / POJO的属性并将其公开为。它很粗糙

  • 问题内容: 我正在尝试测试从中获取输入的函数,而我目前正在使用类似以下内容进行测试: 以测试自动化的名义,有什么方法可以伪造输入? 问题答案: 简短的答案是猴子补丁 。 这是一个使用a的简单示例,该示例丢弃提示并返回我们想要的内容。 被测系统 测试用例:

  • 我有以下代码: 我只想模拟这些行,并在,因为我将有多个测试用例,具体取决于行(文件为空,行为空,我只得到一行,我得到几行,等等)。 注意:我使用库访问FTP服务器上的文件,因此方法将作为返回类型,而具有。 我正在使用junit 4.12和mockito 3.1.0 提前感谢!

  • 问题内容: 我正在开发一个Web应用程序,该应用程序显然在iOS设备中存在问题。问题是我不拥有iOS设备,而是在Linux Ubuntu中进行开发。我正在寻找一种在Linux(尤其是浏览器)中仿真/模拟此OS的方法,但是还没有找到任何东西。 到目前为止,我发现的是iOS SDK的Simulator,但这是针对Mac的。还有一些Windows模拟器。有人做过吗? 问题答案: 我能想到的唯一解决方案是