Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

MUnit JSON Assertion

DZone's Guide to

MUnit JSON Assertion

Learn how to write MUnit tests to test JSON response payloads from a REST API in Mule, using a Groovy script, to avoid contract conflicts.

· Integration Zone ·
Free Resource

The new Gartner Critical Capabilities report explains how APIs and microservices enable digital leaders to deliver better B2B, open banking and mobile projects.

For a REST API in Mule which returns a JSON response, it is always advisable to write MUnit tests and assert the entire JSON response payload to avoid contract conflicts/mismatches. MUnit does not have any out-of-the-box component to compare two JSON files. In this example, we are using a Groovy script for this comparison/assertion.

Objective

Our objective is loading expected JSON data from a file and comparing it with actual MUnit payload which we got from the tested flow.

Steps

  1. Create a Mule project using Anypoint Studio.

  2. Create a flow called Flow1 with an HTTP inbound endpoint and set a JSON payload to send back as a response.

  3. Create an MUnit test case for the above flow.

  4. Inside test/resources, create a JSON file (expectedOutcome.json) which holds the expected JSON payload.

  5. In your MUnit TestCase, add a flow ref to call Flow1.

  6. After the flow ref, create a variable and load the expected json data from the file using the following MEL: #[getResource('expectedOutcome.json').asString()] 

  7. Now, in your MUnit test case, drag and drop a Groovy component after the flow-ref.

  8. Add the following script to the Groovy component: def map1 = new groovy.json.JsonSlurper().parseText(payload)def map2 = new groovy.json.JsonSlurper().parseText(flowVars.expectedOutcome)assert map1 == map2

  9. Run your MUnit test; it will return a Test Case success if both JSON files/data are identical.

Refer to the code below for the full Flow and MUnit code.

Flow:

    <flow name="Flow1">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{
"test":{
"data":{
"name":"dk",
"age":"26"
}
}
}]]></dw:set-payload>
        </dw:transform-message>
    </flow>

 

MUnit Test Case:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:munit="http://www.mulesoft.org/schema/mule/munit" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:core="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/munit http://www.mulesoft.org/schema/mule/munit/current/mule-munit.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd">
    <munit:config name="munit" doc:name="MUnit configuration" mock-connectors="false" mock-inbounds="false"/>
    <spring:beans>
        <spring:import resource="classpath:testbatch.xml"/>
    </spring:beans>
    <munit:test name="testbatch-test-suite-Flow1Test" description="Test">
        <flow-ref name="Flow1" doc:name="Flow-ref to Flow1"/>
        <set-variable variableName="expectedOutcome " value="#[getResource('expectedOutcome.json').asString()]" doc:name="set expectedOutcome Variable"/>
        <scripting:transformer doc:name="Groovy">
            <scripting:script engine="Groovy"><![CDATA[def map1 = new groovy.json.JsonSlurper().parseText(payload)
def map2 = new groovy.json.JsonSlurper().parseText(flowVars.expectedOutcome)

assert map1 == map2]]></scripting:script>
        </scripting:transformer>
    </munit:test>
</mule>


Expected outcome file:

{
  "test": {
    "data": {
      "name": "dk",
      "age": "26"
    }
  }
}


The new Gartner Critical Capabilities for Full Lifecycle API Management report shows how CA Technologies helps digital leaders with their B2B, open banking, and mobile initiatives. Get your copy from CA Technologies.

Topics:
munit ,mule 3.7 ,unit testing ,groovy ,json ,integration

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}