Mule - 您会为FunctionalTestCase推荐哪些代码片段,它们的区别是什么?

时间:2014-03-10 04:17:10

标签: mule

我遇到了两个看似相似但又不同的功能测试代码变体。哪个是推荐的,它们的区别是什么?

=== Snippet 1 ===

@Override
    protected String getConfigResources() {
        return "src\\main\\app\\simplejunittest.xml";
    }

    @Test
    public void testHelloWorldFlow2Returns2() throws Exception
    {
        runFlowWithPayloadAndExpect("simplejunittestFlow1", "someTextxxxx", "Pass");
    }


    ///////////////////////////// HELPERS ////////////////////////////////////////
    /**
    * Run the flow specified by name using the specified payload and assert
    * equality on the expected output
    *
    * @param flowName The name of the flow to run
    * @param expect The expected output
    * @param payload The payload of the input event
    */
    protected <U, T> void runFlowWithPayloadAndExpect(String flowName, U payload, T expect) throws Exception
    {
        Flow flow = lookupFlowConstruct(flowName);
        MuleEvent event = FunctionalTestCase.getTestEvent(payload);
        MuleEvent responseEvent = flow.process(event);

        assertEquals(expect, responseEvent.getMessage().getPayload());
    }

    /**
     * Retrieve a flow by name from the registry
     *
     * @param name Name of the flow to retrieve
     */
    protected Flow lookupFlowConstruct(String name)
    {
        return (Flow) FunctionalTestCase.muleContext.getRegistry().lookupFlowConstruct(name);
    }

=== Snippet 2 ===

@Override
protected String getConfigResources() {
    return "./src/main/app/simplejunittest.xml";
}

@Test
public void testClient2PersonMigration() throws Exception {
    MuleClient client = muleContext.getClient();
    String payload = "someTextxxxx";
    Map<String, Object> messageProperties = null;
    MuleMessage result = client.send("http://localhost:8081/", payload, messageProperties); //URL, Payload, MessageProperties

    assertNotNull(result);
    assertNull(result.getExceptionPayload());
    assertFalse(result.getPayload() instanceof NullPayload);
    assertEquals("Pass", result.getPayloadAsString()); //if I comment this it works
}

=== Snippet 1&amp;的配置XML 2 ===

<flow name="simplejunittestFlow1" doc:name="simplejunittestFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
    <set-payload value="#['Fail']" doc:name="Set Payload"/>
    <flow-ref name="simplejunittestFlow2" doc:name="Flow Reference"/>
</flow>
<sub-flow name="simplejunittestFlow2" doc:name="simplejunittestFlow2">
    <set-payload value="#['Pass']" doc:name="Set Payload"/>
</sub-flow>

问题:在代码段1和2之间是否有推荐的内容?

2 个答案:

答案 0 :(得分:1)

在Snippet1中,您可以直接使用某个有效负载运行流,并在Snippet2中将有效负载发送到流的入站端点。因此,区别在于Snippet1中的入站端点被忽略,如果您不需要测试端点,则可以使用此方法。

答案 1 :(得分:1)

最大的区别在于,在代码段1中,您发送的消息并不代表将会影响您服务的实际消息,就像在代码段2中所做的那样。实际上,您缺少所有设置的入站消息属性。 HTTP传输。另外,您使用String有效负载而不是InputStream有效负载,就像HTTP传输一样。

因此,我强烈建议使用代码段2来获得最真实的测试条件。在Snippet 2中的BTW,您宁愿使用通用HTTP客户端来确保该服务也适用于非Mule客户端。此外,您应该使用动态端口功能而不是硬编码8081来避免在运行测试时发生冲突。

我会将片段1保留给私有流或具有入站端点类型的流,该入口端点类型不具有任何自然的入站属性,例如VM。