Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot CamelTestSupport与使用@Autowired类的路由_Spring Boot_Apache Camel_Spring Test - Fatal编程技术网

Spring boot CamelTestSupport与使用@Autowired类的路由

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

在得到了美国的专家们的帮助后,我又遇到了一个问题。 下面是我的测试类-一个简单的测试,测试一个只有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的数据,因此我有一个用于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 {

}