我有两个疑问:
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() {
}
}
答案 0 :(得分:3)
在测试执行期间,您可以使用adviseWith
截获到http4
端点的交换交付,然后将其重新路由到mock:
端点。原始代码可以保持原样。请查看测试案例here。如果您使用的是Camel 3.x,则API已更改,请改为参考this test case。
要模拟@Value
批注,请在Spring中使用TestPropertySource
批注,并使用合适的运行程序(例如SpringJUnit4ClassRunner
)运行测试类。如果您使用TestPropertySource