在Mule中对流的单元测试进行模拟过滤

时间:2014-03-21 17:58:08

标签: unit-testing testing mule esb

我有一个流程,我想测试如下:

<flow
    name="MyFlow"
    processingStrategy="synchronous">

    <all>
        <processor-chain>
            <and-filter>
                <filter ref="Filter1" />
                <filter ref="Filter2" />
                <filter ref="Filter3" />
            </and-filter>
            <!-- bla bla bla. doesnt matter for this question -->
        </processor-chain>
           <!-- more stuff that doesnt matter -->
    </all>
</flow>

过滤器1,2和3都是自定义过滤器。

我遇到了过滤器2的问题,因为它有一些我无法在单元测试环境中复制或执行的集成代码。无论如何,告诉我的测试只是接受过滤器会很棒。

我刚试过这样的事情(我的测试类正在扩展FunctionalTestCase):

    muleContext.getRegistry().registerObject(
            "Filter2",
            new FilterThatJustAcceptsEverything());

但是,这不起作用。

有没有办法模拟该过滤器或其代码的某些部分仅用于此特定测试?

这就是我在我的测试方法中调用它的方式:

    flow = muleContext.getRegistry().lookupObject(
            "MyFlow");
    String content = "bananas";
    MuleEvent result = flow.process(getTestEvent(content));

提前致谢。

1 个答案:

答案 0 :(得分:2)

对于模拟,最好的方法是使用munit - https://github.com/mulesoft/munit

你可以在哪里模拟过滤器只返回相同的事件,所以看起来它只是通过。类似于:

whenMessageProcessor("expression-filter").withAttributes(...).thenReturnSameEvent();

或者,如果您想使用标准的FunctionalTestCase,我建议使用并排配置 - http://www.mulesoft.org/documentation/display/current/Using+Side-by-Side+Configuration+Files并提供存根配置。

看起来您的过滤器已经是全球性的。因此,您可以做的是将过滤器放在单独的配置“filters.xml”中,并在测试用例中提供“filters-stubs.xml”。它们只能是通用过滤器,总是如此返回:

<expression-filter expression="#[true]" name="Filter1" />

并在测试中加载stub配置:

 @Override
    protected String getConfigResources()
    {
        return "main.xml, filters-stubs.xml";
    }