我遇到了两个看似相似但又不同的功能测试代码变体。哪个是推荐的,它们的区别是什么?
=== 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之间是否有推荐的内容?
答案 0 :(得分:1)
在Snippet1中,您可以直接使用某个有效负载运行流,并在Snippet2中将有效负载发送到流的入站端点。因此,区别在于Snippet1中的入站端点被忽略,如果您不需要测试端点,则可以使用此方法。
答案 1 :(得分:1)
最大的区别在于,在代码段1中,您发送的消息并不代表将会影响您服务的实际消息,就像在代码段2中所做的那样。实际上,您缺少所有设置的入站消息属性。 HTTP传输。另外,您使用String
有效负载而不是InputStream
有效负载,就像HTTP传输一样。
因此,我强烈建议使用代码段2来获得最真实的测试条件。在Snippet 2中的BTW,您宁愿使用通用HTTP客户端来确保该服务也适用于非Mule客户端。此外,您应该使用动态端口功能而不是硬编码8081
来避免在运行测试时发生冲突。
我会将片段1保留给私有流或具有入站端点类型的流,该入口端点类型不具有任何自然的入站属性,例如VM。