如何使用模拟替换重量级输入端点并向其发送消息?
说我有以下路线。
from("spring-ws:rootqname:{http://myNameSpace}SomeRequest?endpointMapping=#endpointMapping").
processor(new VeryComplicatedProcessor()).
to(etc).
to(etc)...
换句话说,一个Spring web服务可以进行整个处理。
测试此路由的一种方法是在Web服务器中启动Web服务并向其发送消息,但这比我想要的更多开销。
相反,我希望如果我mock all of my endpoints,我应该能够做到这一点:
public class RouteTest extends CamelSpringTestSupport {
@Override
public String isMockEndpoints() {
return "*"; // mock everything
}
@Test
public void simpleDirectTest() throws Exception {
String realURI = "spring-ws:rootqname:{http://myNameSpace}SomeRequest?endpointMapping=#endpointMapping";
String mockedURI = "mock:" + realURI;
String msg = buildSomeSoapMsg();
Object out = template.requestBody(mockedURI, msg);
log.debug(out.toString());
}
...
}
...让整个路线运行并将响应返回给我。相反,我只是将消息发回给我,并且路线尚未运行。
我对嘲笑的理解不正确吗?如果是这样,有另一种方法来实现这一目标吗?我真的很想避免实际启动Web服务来测试这些路由。
谢谢大家。
编辑 - 它看起来好像我可以用AdviceWith来解决这个问题,但AdviceWith似乎只能用于输出,而不是输入,如上所述。
答案 0 :(得分:1)
你有几个选择...如果你只是试图测试路由的其余部分(从VeryComplicatedProcessor开始),那么你可以拆分路由,以便你可以使用direct等测试它...... / p>
from("spring-ws:rootqname: {http://myNameSpace}SomeRequest?endpointMapping=#endpointMapping").
.to("direct:processRequest");
from("direct:processRequest").
processor(new VeryComplicatedProcessor()).
to(etc).
to(etc)...
另一个选择是在单元测试中站立Web服务并使用HTTP客户端API来模拟对实际路由的请求。请参阅camel-spring-ws examples
最后,如果您确实需要替换测试的端点,请使用properties覆盖端点定义或adviceWith或intercept策略,以提供更大的灵活性(尽管起初可能会令人困惑)...
答案 1 :(得分:1)
在Apache Camel 2.9中,在advice中有一个新的replaceFrom方法,它允许您在使用其他端点进行单元测试之前替换使用者。例如,您可以使用直接端点替换spring-ws。然后在单元测试中向该直接端点发送消息。和Ben在他的回答中上面发布的一行一样。详见:http://camel.apache.org/advicewith.html