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.
Join the DZone community and get the full member experience.
Join For FreeFor 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
Create a Mule project using Anypoint Studio.
Create a flow called Flow1 with an HTTP inbound endpoint and set a JSON payload to send back as a response.
Create an MUnit test case for the above flow.
Inside test/resources, create a JSON file (expectedOutcome.json) which holds the expected JSON payload.
In your MUnit TestCase, add a flow ref to call Flow1.
After the flow ref, create a variable and load the expected json data from the file using the following MEL:
#[getResource('expectedOutcome.json').asString()]
Now, in your MUnit test case, drag and drop a Groovy component after the flow-ref.
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
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"
}
}
}
Opinions expressed by DZone contributors are their own.
Comments