使用 类 和 @Autowired 的路由的 CamelTestSupport

CamelTestSupport with routes using classes with @Autowired

在问题 专家的帮助下,我又遇到了一个问题。

下面是我的测试 class - 一个简单的测试,用于测试只有 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

我发现 不明智 当您想使用 Spring 时扩展 CamelTestSupport 是不明智的。事实上,有更好的方法 - 使用 CamelSpringBootRunner 代替。

嗯...我说 "better"。您会发现自己附加了大量注释。在您需要的东西中:

  • 确保您正确引导 Camel 的引导程序
  • 您希望添加到类路径(以及所有 bean)的路由;这确保它们通过 Spring 的注册表
  • 添加到 Camel 的注册表中
  • 您必须在每次 运行 之后弄脏上下文,否则您的测试会进入不稳定状态。
  • 您可以通过指定 @MockEndpoints@MockEndpointsAndSkip 来自动模拟端点。前者将数据发送到实际路由。

以下只是一个开始。可以在 in the formal docs.

中找到其中的许多注释及其文档
@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 {

}

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

然而,与 一样,香草 Spring 单元测试最近经常涉及使用所有这些大量注释。 Camel 对此表示支持,他的回答也显示了这一点。这也是例如 Spring 完成引导测试等的方式

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