如何测试这条骆驼路线?依赖注入和环境变量

时间:2019-06-16 17:36:09

标签: java unit-testing apache-camel

我有两个疑问:

a。如何模拟http4组件,而我的路线不知道何时模拟它以及何时真实?

b。运行测试时如何初始化myDestinationEndpoint?

package my.package

@Component
public class MyRoute extends RouteBuilder {
    @Value("${MY_DESTINATION_ENDPOINT}")
    private String myDestinationEndpoint;

    from("direct:my-route")
        .split()
            .method(MyBean.class,"split") //splits the message in two messages. One will pass and other will be redirect to http4
            .aggregationStrategy(MyBean.aggregator()) //After redirect to http4, the response will be added to the first message and continue to the next route.
                .choice()
                    .when().method(MyBean.class,"shouldRedirect")
                        .to("http4:" + myDestinationEndpoint + "?bridgeEndpoint=true") //How to mock here???
                        .unmarshal(new JacksonDataFormat(Object.class))
                 .end()
            .end()
    ;
}

尝试过什么?

a。为了模拟,我找到了“模拟”组件。但是在这种情况下,我很难对路由中的模拟进行编码。对我来说,就像我有一个带有模拟的测试代码可以在测试环境中运行,而其他类似的代码却没有可以在生产环境中运行的类似代码。但是,据我了解,测试代码应与生产代码相同。

.when().method(MyBean.class,"shouldRedirect")
    .to("mock:" + myDestinationEndpoint)

我希望模拟可以作为接口使用,并且在生产中应该注入真实的对象,而在测试中应该注入伪造/模拟的对象。

b。因为我陷入了步骤a。我没有太多时间对此进行调查。在本地主机上运行em时,我将eclipse中的myDestinationEndpoint设置为Java程序参数。运行em QA和PRD时,我使用configmap文件(.yml)。

编辑:试图实现ShellDragon的建议。

我已经实现了这个测试类,但出现了这个错误:

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

我在/ src / test / resources和/ src / test / resources / my / package中添加了FirstTest.properties文件

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = AgenciaInternalRoute.class) //Classe que contém valores a serem injetados
@TestPropertySource //flag que faz com que a classe indicada em @ContextConfiguration receba os valores de um arquivo de propriedades
public class FirstTest extends CamelTestSupport {

    @Autowired
    private TestRestTemplate restTemplate;


    @Override
    protected RouteBuilder createRouteBuilder() throws Exception{
        return new MyRoute();
    }

    @Test
    public void simpleTest() {

    }
}

1 个答案:

答案 0 :(得分:3)

在测试执行期间,您可以使用adviseWith截获到http4端点的交换交付,然后将其重新路由到mock:端点。原始代码可以保持原样。请查看测试案例here。如果您使用的是Camel 3.x,则API已更改,请改为参考this test case

要模拟@Value批注,请在Spring中使用TestPropertySource批注,并使用合适的运行程序(例如SpringJUnit4ClassRunner)运行测试类。如果您使用TestPropertySource

,则无需从命令行进行其他修改