2014-12-31 85 views
0

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

<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 

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

在此先感谢

回答

2

既然你打电话通过HTTP协议,这隐含转换有效载荷类型的流量。所以单元测试中的回复将不包含一个String,而是一个InputStream。这是预期的,所以你应该测试一个InputStream而不是String。要将值作为字符串获取,您可以使用方法MuleMessage#getPayload(java.lang.Class),该方法将使用注册的变换器将有效负载转换为字符串。

@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,并且组件需要一个字符串。

所以你将不得不通过在组件之前添加一个对象到字符串变换器来将有效载荷转换为字符串。完整的流程将是这样的。

<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> 
+0

感谢您的答复。我根据您的建议进行了更改。现在我得到了这个错误“导致异常的组件是:DefaultJavaComponent {muletestFlow1.component.3418143}。消息有效载荷的类型为:ContentLengthInputStream” – user3855589

+0

我试过这个使用VM端点,然后我可以成功运行。但我怎么能使用http端点请帮忙 – user3855589

+0

当我在HTTP上调用流时是一个InputStream(准确地说ContenLengthInputStream)时,我回答了有效载荷。这是预期的行为,所以你应该测试。此外,我期望您明确将有效负载转换为字符串的语句也会失败。稍后当我在电脑前时,我会更新自己的答案。 –