使用 类 和 @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
中找到一些单元测试,您也可以将其用作灵感。
在问题
下面是我的测试 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 中引用路由。
然而,与
您可以在 camel-test-spring
中找到一些单元测试,您也可以将其用作灵感。