面对骡子测试中的问题

时间:2014-12-31 06:48:25

标签: mule

我正面临着骡子测试的问题。我只是尝试了简单的功能测试示例。 以下是我的流程

 <flow name="muletestFlow1" doc:name="muletestFlow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="test" doc:name="HTTP"/>
        <response>
            <object-to-string-transformer />
        </response>
        <component class="com.org.Square" doc:name="Square"/>
        <component class="com.org.Neg doc:name="Neg"/>
    </flow>

以下是我的测试类

@Test
    public void testSquareAddInverse() throws Exception {

        MuleClient client = muleContext.getClient();

        MuleMessage reply = client.send ("http://localhost:8081/test", "3", null, 5000);

        assertNotNull(reply);
        assertNotNull(reply.getPayload());
        assertTrue(reply.getPayload() instanceof String);
        String result = (String)reply.getPayload();
        assertEquals("-9", result);

如果我作为junit测试在类之上运行,则会出现以下错误。

java.lang.AssertionError
    at org.junit.Assert.fail(Assert.java:92)
    at org.junit.Assert.assertTrue(Assert.java:43)
    at org.junit.Assert.assertTrue(Assert.java:54)
    at com.test.TestEx.testSquareAddInverse(TestEx.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:46)
    at org.junit.internal.runners.statements.FailOnTimeout$1.run(FailOnTimeout.java:28)

有什么解决方案请帮帮我。 如果我评论这一行

assertTrue(reply.getPayload() instanceof String);

然后出现以下错误。

java.lang.ClassCastException: org.mule.transport.http.ReleasingInputStream cannot be cast to java.lang.String

此代码有什么问题?我怎么解决这个问题。请帮帮我

提前致谢

1 个答案:

答案 0 :(得分:2)

由于您通过http协议调用流,该协议隐式转换有效负载类型。所以单元测试中的回复不包含String而是包含InputStream。这是预期的,因此您应该测试InputStream而不是String。要将值作为String获取,您可以使用方法MuleMessage#getPayload(java.lang.Class),它将使用已注册的变换器将有效负载转换为String。

    @Test
    public void testGetNegaiveNine() throws Exception {
        MuleClient client = muleContext.getClient();
        MuleMessage reply = client.send ("http://localhost:8081/test", "3", null, 5000);

        assertNotNull(reply);
        assertNotNull(reply.getPayload());
        assertTrue(reply.getPayload() instanceof InputStream);
        String result = reply.getPayload(String.class);
        assertEquals("-9", result);
    }

您在流程中获得的异常 之后。

"DefaultJavaComponent{muletestFlow1.component.3418143}. Message payload is of type: ContentLengthInputStream"

是因为组件无法处理流中的消息所具有的有效负载。由于您要向流中发送HTTP POST,因此传入消息的有效负载是ContenLengthInputStream,并且组件需要String。

因此,您必须通过在组件之前添加对象到字符串转换器将有效负载转换为String。完整的流程将是这样的。

<flow name="muletestFlow1" doc:name="muletestFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="test" doc:name="HTTP"/>
    <response>
        <!-- Ensure that the response is a String -->
        <object-to-string-transformer />
    </response>
    <!-- Ensure that the incoming request is a String -->
    <object-to-string-transformer />
    <component class="com.org.Square" doc:name="Square"/>
    <component class="com.org.Neg doc:name="Neg"/>
</flow>