Mocking Resources for Your Tests

As your tests suites start to get bigger and more complex, it’s a good practice to externalize some parts of the test code, not only so that you can keep the code clean and organized but also to reuse the files that you need to mock for your tests.

Mule 3 uses a getResourceAsString() function to incorporate external or mocked resources into your tests. In Mule 4, you can leverage DataWeave to mock your test code, either by creating DataWeave scripts or by using variables in a DataWeave module.

Mocking Files Using DataWeave File

You can write a DataWeave file that returns the data that you want to mock, save the file under a folder in src/test/resources and then use a DataWeave function from your test to read this file.

For example, imagine that you have defined a mockPost.dwl file in the src/test/resources/sample_data folder with the following content:

%dw 2.0
output application/json
	"foo" : "var"

This DataWeave file (mockPost.dwl) is a sample that creates a mock payload that you want to return in an http:request request.

When configuring the then-return section in the mock-when, use the readUrl function to read the mapping file:

  <munit-tools:payload value="#[readUrl('classpath://sample_data/mockPost.dwl')]" mediaType="application/json" encoding="UTF-8" />

The classpath-based URL uses the classpath: protocol prefix to find the file defined in src/test/resources.

Mocking Files Using Variables in a DataWeave Module

You can create a DataWeave module to centralize all your mocked data in a single file by declaring it using DataWeave variables.

For example, imagine that you create a custom DataWeave module by creating a TestData.dwl file in src/test/resources, and you add variables with references to different mocked data, either from files or inline:

import getResourceAsString from MunitTools

var mockPost = readUrl('classpath://sample_data/mockPost.dwl')
var foo = "N123"
var jsonFromFile = read(getResourceAsString('sample_data/mydata.json'), 'application/json')
var jsonObject = { paymentID: "1B56925769601335TLQMIWVY" }

You can then access any of the defined variables in the DataWeave module by importing the variables from your module:

<munit-tools:then-return >
        				<munit-tools:variable key="ticket" value="#[import TestData output application/json --- TestData::mockPost]" mediaType="application/json" />

Was this article helpful?

πŸ’™ Thanks for your feedback!

Edit on GitHub
Give us your feedback!
We want to build the best documentation experience for you!
Help us improve with your feedback.
Take the survey!