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

使用cametestsupport进行骆驼单元测试,模板始终为空

何安宜
2023-03-14

我正在用Camel做一个简单的单元测试。我只想从一个文件(参考资料下)读取JSON内容,将其发送到Java类进行验证——这就是我试图测试的路径。无论我做什么,我用来发送主体(json)的模板总是空的。这是我的代码:

public class RouteTests extends CamelTestSupport {

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

    @Produce(uri = "direct:start")
    protected ProducerTemplate template;

    @Autowired
    JSONObject testJson;

    @Before
    public void setUp() throws Exception {
        try {
            final ObjectMapper objectmapper = new ObjectMapper();
            final ClassLoader loader = Thread.currentThread().getContextClassLoader();
            final InputStream stream = loader.getResourceAsStream("test.json");
            testJson = new JSONObject ((Map)objectmapper.readValue(stream, Map.class));

            // Start Camel
            context = new DefaultCamelContext();
            context.addRoutes(createRouteBuilder());
            context.start();
        }
        catch (IOException e) {
        }
    }

    @Test
    public void testSendMatchingMessage() throws Exception {
        //resultEndpoint.expectedBodiesReceived(expectedBody);
        resultEndpoint = getMockEndpoint("mock:result");
        //resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class);
        resultEndpoint.expectedMessageCount(1);
        template.sendBody("direct:start", testJson);
        resultEndpoint.assertIsSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("direct:start")
                        .filter().method(ValidationProcessor.class, "validate")
                        .to("mock:result");
            }
        };
    }

    @Override
    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry jndi = super.createRegistry();
        jndi.bind("ValidationProcessor", new ValidationProcessor", ());

        return jndi;
    }
}

我面临的问题:

>

  • 最初,结果终点也总是空的。(我使用FilterTest.java作为参考)。然后我不得不做一个明确的决定

     resultEndpoint = getMockEndpoint("mock:result");
    

    解决这个问题。

    然后我读到我必须重写createRegistry,但我不知道如何绑定。我只是使用了验证类的名称,但我不知道这是否正确。

    但是模板总是空的。空指针异常(NPE)位于

     template.sendBody("direct:start", testJson);
    

    如有必要,也请给我指一些阅读材料。Apache Camel文档链接到的参考代码甚至没有我在setUp方法中使用的Camel的开头。

  • 共有2个答案

    何超英
    2023-03-14

    尝试从Camel上下文创建producertemplate,如下所示:

    public class RouteTests extends CamelTestSupport {
    
        @EndpointInject(uri = "mock:result")
        protected MockEndpoint resultEndpoint;
    
        protected ProducerTemplate template;
    
        @Autowired
        JSONObject testJson;
    
        @Before
        public void setUp() throws Exception {
            try {
                final ObjectMapper objectmapper = new ObjectMapper();
                final ClassLoader loader = Thread.currentThread().getContextClassLoader();
                final InputStream stream = loader.getResourceAsStream("test.json");
                testJson = new JSONObject ((Map)objectmapper.readValue(stream, Map.class));
                //start camel
                context = new DefaultCamelContext();
                context.addRoutes(createRouteBuilder());
                context.start();
                template = context.createProducerTemplate();
            }
            catch (IOException e) {
            }
        }
    
        @Test
        public void testSendMatchingMessage() throws Exception {
            //resultEndpoint.expectedBodiesReceived(expectedBody);
            resultEndpoint = getMockEndpoint("mock:result");
            //resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class);
            resultEndpoint.expectedMessageCount(1);
            template.sendBody("direct:start", testJson);
            resultEndpoint.assertIsSatisfied();
        }
    
        @Override
        protected RouteBuilder createRouteBuilder() {
            return new RouteBuilder() {
                public void configure() {
                    from("direct:start")
                            .filter().method(ValidationProcessor.class, "validate")
                            .to("mock:result");
                }
            };
        }
    
        @Override
        protected JndiRegistry createRegistry() throws Exception {
            JndiRegistry jndi = super.createRegistry();
            jndi.bind("ValidationProcessor", new ValidationProcessor());
    
            return jndi;
        }
    }
    

    因此,在设置()中,只需添加

    template = context.createProducerTemplate();
    

    并删除@product(uri=“direct:start”)

    申嘉慕
    2023-03-14

    我认为你已经错过了很多真正有用的东西,CamelTestSupport为你做。它有自己的setUp方法,您应该重写它。我相信你的测试应该是这样的:

    public class RouteTests extends CamelTestSupport {
    
        private JSONObject testJson;
    
        @Override
        public void setUp() throws Exception {
            // REALLY important to call super
            super.setUp();
    
            ObjectMapper objectmapper = new ObjectMapper();
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            InputStream stream = loader.getResourceAsStream("test.json");
            testJson = new JSONObject(objectmapper.readValue(stream, Map.class));
        }
    
        @Override
        protected RouteBuilder createRouteBuilder() {
            return new RouteBuilder() {
                @Override
                public void configure() {
                    from("direct:start")
                            .filter().method(ValidationProcessor.class, "validate")
                            .to("mock:result");
                }
            };
        }
    
        @Test
        public void testSendMatchingMessage() throws Exception {
            MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
            resultEndpoint.expectedMessageCount(1);
            template.sendBody("direct:start", testJson);
            resultEndpoint.assertIsSatisfied();
        }
    }
    

    实际上,我会完全删除设置的覆盖,并将测试数据的读取放入测试方法本身。然后就可以清楚地知道这些数据是用来做什么的,并且可以删除testJson字段。

    public class RouteTests extends CamelTestSupport {
    
        @Override
        protected RouteBuilder createRouteBuilder() {
            return new RouteBuilder() {
                @Override
                public void configure() {
                    from("direct:start")
                            .filter().method(ValidationProcessor.class, "validate")
                            .to("mock:result");
                }
            };
        }
    
        @Test
        public void testSendMatchingMessage() throws Exception {
            ObjectMapper objectmapper = new ObjectMapper();
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            InputStream stream = loader.getResourceAsStream("test.json");
            JSONObject testJson = new JSONObject(objectmapper.readValue(stream, Map.class));
    
            MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
            resultEndpoint.expectedMessageCount(1);
            template.sendBody("direct:start", testJson);
            resultEndpoint.assertIsSatisfied();
        }
    }
    

    那里,简单多了。

     类似资料:
    • 问题内容: 我选择的数据库是MongoDB。我正在编写一个数据层API,以从客户端应用程序中抽象实现细节- 也就是说,我实质上是在提供一个公共接口(一个充当IDL的对象)。 我正在以TDD方式测试自己的逻辑。在每个单元测试之前,调用一个方法来创建数据库单例,此后,当测试完成时,将调用一个方法来删除数据库。这有助于促进单元测试之间的独立性。 几乎所有单元测试(即 执行上下文查询 )都需要先进行某种插

    • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

    • 我正在构建一个android应用程序,它使用Firebase作为后端,并采用模型、视图和演示者架构。然而,Firebase是一种云服务的事实使我的android应用程序中的自动测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法看到如何在我的应用程序中实现Firebase代码的单元测试。在端到端测试方面,我也陷入了困境。 由于测试是任何android应用程序的基础,没有it应用程序开发

    • 在camel中,不是所有endpoint都支持INOUT,对吗 如果是,那么文档的哪一部分说明了哪个endpoint支持哪个,或者这是一种隐含的知识。 它需要来支持。 下面是我得出结论的代码示例。 我正在玩骆驼示例-jms-file,我将其修改为 队列1-- 然后我使用下面的代码发送msg到队列: 执行上述操作时给出以下响应: 如果我们观察执行输出,我们将看到收到的响应在从文件开始的路由完成之前打

    • 问题内容: 我的公司一直在评估Spring MVC,以确定我们是否应该在下一个项目中使用它。到目前为止,我喜欢我所看到的内容,现在,我正在查看Spring Security模块,以确定是否可以/应该使用它。 我们的安全要求非常基本。用户只需要能够提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息);并且网站上的页面很少(常见问题解答,支持等),应该为匿名用户提供访问权限。 在我创建的

    • 使用Android Studio进行单元测试 原文链接 : Unit Testing With Android Studio 原文作者 : Rex St John 译文出自 : 开发技术前线 www.devtf.cn 译者 : ZhaoKaiQiang 校对者: zhengxiaopeng 状态 : 校对完 这篇文章介绍了在Android Studio中进行单元测试的基础部分。 很多教程都指导你应