在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
。
答案 0 :(得分:2)
我发现当你想在Spring中使用任何东西时,扩展CamelSpringBootRunner
是不明智的。事实上,有一种更好的方法 - 使用@MockEndpoints
代替。
嗯......我说“更好”。你会发现自己附上了大量的注释。你需要的东西:
@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。