Mocks for microservice environments

Getting Started

Tutorial Videos

Config Syntax

Request Matching

Response Templating

Async Actors (Kafka, AMQP etc.)

Performance & Chaos Testing

Remote Management


Response Templating

Response Fields

In response template, one can specify status, headers and body of HTTP message. Here’s quick example:

  - port: 8080
      - path: /api-call
          status: 201
            content-type: application/json
            x-custom-id: 12345
          body: '{"result": "created"}'

Any of those fields allows using dynamic template that will be evaluated for each request. Like this:

  - port: 8080
      - path: /api-call
          status: "{{request.queryString.rc}}"
            content-type: '{{request.headers.accept}}'
            x-custom-id: '{{random.int 0 1000}}'
          body: '{"result": "created", "name": "{{fake.lastname}}" }'

Note: for headers, only the value part is subject for templating. Mind the global headers feature, too.

The body can be direct response string:

  body: 'hello world'

or a string that starts with @ sign to indicate a file on disk:

  body: '@some/path/my_template.json.hbs'

Note: The template file path has to be relative to the directory of the config file.

Dynamic Values

By default, dynamic templates use Handlebars syntax that looks like this: {{namedValue}} or {{request.path}} or {{fake.address}} etc.

Note: To switch into Jinja2 as templating engine, use the templatingEngine option of configuration syntax.

Below is the reference of available dynamic value generators.


For random names, addresses etc, please refer to Faker’s functionality.


Here is a list of date shifting examples as a Handlebars response template:

  "now": "{{ date.date '%Y-%m-%d %H:%M %f' }}",
  "1_week_back": "{{ date.date '%Y-%m-%d %H:%M %f' -604800 }}",
  "1_week_forward": "{{ date.date '%Y-%m-%d %H:%M %f' 604800 }}",
  "1_day_back": "{{ date.date '%Y-%m-%d %H:%M %f' -86400 }}",
  "1_day_forward": "{{ date.date '%Y-%m-%d %H:%M %f' 86400 }}",
  "1_hour_back": "{{ date.date '%Y-%m-%d %H:%M %f' -3600 }}",
  "1_hour_forward": "{{ date.date '%Y-%m-%d %H:%M %f' 3600 }}",
  "1_minute_back": "{{ date.date '%Y-%m-%d %H:%M %f' -60 }}",
  "1_minute_forward": "{{ date.date '%Y-%m-%d %H:%M %f' 60 }}"


Faker library is provided for generating some dynamic data. It is available as fake object. Refer to the official docs for all capabilities. Below are some examples (Handlebars):

  "first_name": "{{ fake.first_name }}",
  "first_name_female": "{{ fake.first_name_female }}",
  "first_name_male": "{{ fake.first_name_male }}",
  "first_name_nonbinary": "{{ fake.first_name_nonbinary }}",
  "last_name": "{{ fake.last_name }}",
  "last_name_female": "{{ fake.last_name_female }}",
  "last_name_male": "{{ fake.last_name_male }}",
  "last_name_nonbinary": "{{ fake.last_name_nonbinary }}",
  "address": "{{ replace ( fake.address ) old='\n' new='\\n' }}",
  "city": "{{ fake.city }}",
  "country": "{{ fake.country }}",
  "hexify_args": "{{ fake.hexify text="MAC Address: ^^:^^:^^:^^:^^:^^" upper=true }}",
  "lexify_args": "{{ fake.lexify text="Random Identifier: ??????????" }}",
  "numerify_args": "{{ fake.numerify text="Intel Core i%-%%##K vs AMD Ryzen % %%##X" }}",
  "random_choices": "{{ fake.random_choices elements=( array 'a' 'b' 'c' 'd' 'e' ) }}",
  "random_digit": {{ fake.random_digit }},
  "random_element": "{{ fake.random_element elements=( array 'a' 'b' 'c' 'd' 'e' ) }}",
  "random_elements": {{ tojson ( fake.random_elements elements=( array 'a' 'b' 'c' 'd' 'e' ) length=3 unique=True ) }},
  "random_int_args": {{ fake.random_int min=10000 max=50000 step=500 }},
  "random_letter": "{{ fake.random_letter }}",
  "random_letters": {{ tojson ( fake.random_letters ) }},
  "random_letters_args": {{ tojson ( fake.random_letters length=32 ) }},
  "random_lowercase_letter": "{{ fake.random_lowercase_letter }}",
  "random_sample": {{ tojson ( fake.random_sample elements=( array 'a' 'b' 'c' 'd' 'e' ) ) }},
  "random_uppercase_letter": "{{ fake.random_uppercase_letter }}"


  "first_name": "Mark",
  "first_name_female": "Sharon",
  "first_name_male": "Brian",
  "first_name_nonbinary": "Jessica",
  "last_name": "Campbell",
  "last_name_female": "Rodriguez",
  "last_name_male": "Combs",
  "last_name_nonbinary": "Mcmillan",
  "address": "035 Angela Brook\nElizabethhaven, MO 35984",
  "city": "Hannaport",
  "country": "Burkina Faso",
  "hexify_args": "MAC Address: 84:DE:AD:1C:AD:D7",
  "lexify_args": "Random Identifier: ZDGINMgIkX",
  "numerify_args": "Intel Core i7-8517K vs AMD Ryzen 3 8887X",
  "random_choices": "['b', 'a', 'd', 'a', 'b']",
  "random_digit": 9,
  "random_element": "d",
  "random_elements": ["a", "a", "d"],
  "random_int_args": 26500,
  "random_letter": "A",
  "random_letters": ["M", "S", "N", "T", "r", "m", "p", "j", "R", "n", "g", "g", "A", "w", "o", "d"],
  "random_letters_args": ["F", "L", "X", "R", "Z", "T", "f", "k", "C", "v", "U", "d", "d", "S", "p", "j", "s", "F", "M", "X", "k", "J", "P", "R", "W", "m", "i", "A", "x", "o", "r", "H"],
  "random_lowercase_letter": "i",
  "random_sample": ["c", "a", "b"],
  "random_uppercase_letter": "U"

An extended list of Faker examples can be found in: Handlebars and Jinja2


There is special kind of template helper, offering named counters like {{counter 'counterName'}}. The counters are global and identified by name. You can also refer to last value of counter by its name like this: {{counterName}}

Request Object

You can reference parts of HTTP request in response templates. It is available as request object. These are the most useful attributes:

And some less frequently used:

Using JSONPath Syntax

You can reference certain fields from request’s JSON by using jsonPath helper like this: jsonPath request.json '$.key'.

Other Template Helpers


{{ escapeHtml '& < \" >' }} a helper to escape HTML special characters. (see html.escape)

tojson(text) (Handlebars only)

The equivalent of tojson filter in Jinja2.

Jinja2 usage: {{ fake.random_letters() | tojson }}

Handlebars usage: {{ tojson ( fake.random_letters ) }}

array(*args) (Handlebars only)

Provides array support in parameters. {{ array 'a' 'b' 'c' 'd' 'e' }} returns ['a', 'b', 'c', 'd', 'e'].

replace(text, old, new, count=None) (Handlebars only)

The equivalent of replace filter in Jinja2.

Jinja2 usage: {{ fake.address() | replace('\n','\\n') }}

Handlebars usage: {{ replace ( fake.address ) old='\n' new='\\n' }}

env(name, default)

Returns the value of environment variable given by name parameter. If the environment variable does not exist in the current shell then the value in default parameter is returned.