user3855589
user3855589

Reputation: 1103

Facing issue in mule testing

I am facing problem with mule testing. I just tries out simple functional testing example. following is my flow

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

and following is my testing class

@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);

If i run above class as junit test then got following error.

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)

What is the solution please help me. If i comment this line

assertTrue(reply.getPayload() instanceof String);

then got following error.

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

What is the wrong in this code? How can i solve this problem. please help me

Thanks in advance

Upvotes: 0

Views: 1260

Answers (1)

Pontus Ullgren
Pontus Ullgren

Reputation: 705

Since you call the flow through http protocol, which implicitly transforms the payload type. So the reply in the unit test will not contain a String but a InputStream. This is expected so you should test for a InputStream instead of a String. To get the value as a String you can use the method MuleMessage#getPayload(java.lang.Class) that will transform the payload to a String using the registered transformers.

    @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);
    }

The exception you get in the flow after that.

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

is because the components can not handle the payload that the message inside your flow has. Since you are sending a HTTP POST into the flow the payload of the incoming message is a ContenLengthInputStream and you components expects a String.

So you will have to transform the payload into a String by adding a object-to-string transformer before the components. The complete flow would then be something like this.

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

Upvotes: 2

Related Questions