骆驼 - 向模拟输入发送消息

时间:2011-08-10 16:56:32

标签: mocking apache-camel

如何使用模拟替换重量级输入端点并向其发送消息?

说我有以下路线。

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似乎只能用于输出,而不是输入,如上所述。

2 个答案:

答案 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覆盖端点定义或adviceWithintercept策略,以提供更大的灵活性(尽管起初可能会令人困惑)...

答案 1 :(得分:1)

在Apache Camel 2.9中,在advice中有一个新的replaceFrom方法,它允许您在使用其他端点进行单元测试之前替换使用者。例如,您可以使用直接端点替换spring-ws。然后在单元测试中向该直接端点发送消息。和Ben在他的回答中上面发布的一行一样。详见:http://camel.apache.org/advicewith.html