CamelTestSupport使用带有@Autowired

时间:2018-03-13 21:37:16

标签: spring-boot apache-camel spring-test

camel unit test with cametestsupport, template is always null的专家帮助之后,我又提出了一个问题。 下面是我的测试类 - 一个测试只有ValidationProcessor POJO的路由的简单测试。

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();
    }
}

当此ValidationProcessor中包含@Autowired组件时,问题就出现了。我的验证方法需要来自Elasticsearch的数据,因此我有弹性客户端的@Autowired。当我运行mvn clean test时,我收到NullPointerException表示此弹性客户端为空。我认为问题是这个测试与Spring没有任何关系,因此问题,但我不知道如何克服这个问题。我的测试需要从Elasticsearch获取数据,因此ValidationProcessor POJO需要@Autowired

3 个答案:

答案 0 :(得分:2)

我发现当你想在Spring中使用任何东西时,扩展CamelSpringBootRunner不明智的。事实上,有一种更好的方法 - 使用@MockEndpoints代替。

嗯......我说“更好”。你会发现自己附上了大量的注释。你需要的东西:

  • 用于确保正确引导Camel的boostrapper
  • 您希望添加到类路径(以及所有bean)的路由;这可以确保它们通过Spring的注册表
  • 添加到Camel的注册表中
  • 每次运行后你都必须弄脏上下文,否则你的测试会进入一个不稳定状态。
  • 您可以指定@MockEndpointsAndSkip@RunWith(CamelSpringBootRunner.class) @BootstrapWith(SpringBootTestContextBootstrapper.class) @ActiveProfiles("test") @SpringBootTest(classes = { YourEntryPointClass.class }) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) @UseAdviceWith @MockEndpoints("direct:*") public class RouteTests { } 来自动阻止端点。前者将数据发送到实际路线。

以下只是一个开始。其中许多注释及其文档都可以找到in the formal docs

/test/test.aspx?DS_Vendor=55039&DS_ProdVer=7.90.100.0&DS_ProdLang=EN&DS_Product=MTT&DS_OfficeBits=32

答案 1 :(得分:2)

当你扩展CamelTestSupport时,它不是一个弹簧应用程序。您需要扩展CamelSpringTestSupport。这将在Spring运行时创建Camel,然后允许bean通过Spring获得IoC。这种测试通常与Camel XML路由一起使用,其中路由在XML文件中定义。但是,您可以使用纯XML文件并在Java DSL中引用路由。

然而,随着Makoto的回答,那么香草弹簧单元测试最近经常使用所有那些无数的注释。骆驼支持这一点以及他的答案显示。这也是例如Spring Boot测试的完成方式等。

您可以在camel-test-spring中找到一些单元测试,也可以作为灵感。

答案 2 :(得分:-2)

您的测试类必须扩展CamelSpringTestSupport并使用@ContextConfiguration注释。使用此批注的classes或locations属性,以便spring知道从哪里加载依赖bean。