Spring boot CamelTestSupport与使用@Autowired类的路由
在得到了美国的专家们的帮助后,我又遇到了一个问题。 下面是我的测试类-一个简单的测试,测试一个只有ValidationProcessor POJO的路由Spring boot CamelTestSupport与使用@Autowired类的路由,spring-boot,apache-camel,spring-test,Spring Boot,Apache Camel,Spring Test,在得到了美国的专家们的帮助后,我又遇到了一个问题。 下面是我的测试类-一个简单的测试,测试一个只有ValidationProcessor POJO的路由 public class RouteTests extends CamelTestSupport { @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @Override
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的数据,因此我有一个用于elastic客户端的@Autowired
。当我运行mvn clean test
时,我得到一个NullPointerException
声明此弹性客户端为null。我认为问题在于,这个测试与Spring无关,因此也没有问题,但我不知道如何克服这个问题。我的测试需要从Elasticsearch获取数据,因此ValidationProcessor POJO确实需要@Autowired
我发现,当您想使用Spring时,扩展CamelTestSupport
是不明智的。事实上,有一种更好的方法可以做到这一点——使用camelspringbootlunner
嗯……我说“更好”。您将发现自己附加了大量注释。您需要的东西包括:
- 一个助推器,以确保您正确引导骆驼
- 您希望添加到类路径的路由(以及所有bean);这确保它们通过Spring的注册表添加到Camel的注册表中
- 您必须在每次运行后弄脏上下文,否则您的测试将进入不稳定状态
- 您可以通过指定
或@MockEndpoints
来自动模拟端点。前者将数据发送到实际路径@MockEndpoints和skip
当您扩展CamelTestSupport时,它就不是一个spring应用程序。您需要扩展
CamelSpringTestSupport
。这将在Spring运行时创建Camel,然后允许bean通过Spring拥有IoC。这种测试通常用于在XML文件中定义路由的Camel XML路由。但是,您可以有一个普通的XML文件,也可以在JavaDSL中引用路由
然而,正如Makoto所回答的那样,vanilla Spring单元测试通常是关于使用所有这些大量注释的。卡梅尔对此表示支持,他的回答也表明了这一点。例如,Spring引导测试也是这样做的
您可以在驼峰测试spring中找到一些单元测试,也可以作为灵感使用。什么是EntryPoint.class?这是我的Spring应用程序吗?我在哪里指定路线?我能把RouteBuilder传递到某个地方吗?@ananth:是的,那就是用
@SpringBootApplication
注释的类。我对路线的测试采取了不同的方法;我一直认为,我测试中的路线声明感觉是人为的和虚假的,我宁愿直接通过Spring将它们连接起来,这样我就知道我在测试什么了。我建议你在这里接上你的实际路线。您可以很好地指定它们,并且可以使用“camel.springboot.java路由排除模式=**/routes您不需要的路由排除模式”
。作为@SpringBootTest
注释中的属性值。您能给我指出一个示例类实现吗?我不明白你所建议的策略的诀窍。例如,我不想使用我的应用程序的实际路由,因为它们有兔子端点。我此次测试的目的只是测试参与路线的POJO。这就是我在测试中重新定义路线的原因。我现有测试的任何部分都不可用吗?以您的方式,我们如何启动驼峰,将路线添加到上下文中等?我想我会不断地提出问题,所以如果你能指出一些我可以参考的实现(并停止打扰你:D)你会想看看@UseAdviceWith
和编织路线,这会有所帮助。文档中对此进行了解释。不将数据发送到RabbitMQ路由,而是用它们代替seda:
端点,这很简单。如果CamelSpringTestSupport扩展了CamelTestSupport,那么CamelTestSupport不应该可用吗?(这是在文档的开头)?
@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 {
}