Swagger/OpenAPI mock server

MockingSwaggerSwagger 2.0Openapi

Mocking Problem Overview


I have an API reference in a Swagger file. I want to create a very simple mock server, so that when I call e.g.:

mymockurl.com/users it will return a predefined JSON (no need to connect to a database).

What's the easiest way to do this? I'm not a backend guy.

Mocking Solutions


Solution 1 - Mocking

An easy way to create simple mock from an OpenAPI (fka Swagger) spec without code is to use a tool call prism available at http://github.com/stoplightio/prism written in Typescript.

This command line is all you need:

./prism run --mock --list --spec <your swagger spec file>

The mock server will return a dynamic response based on the OpenAPI spec. If examples are provided in the spec, prism will return them, if not it will generate dummy data based on the spec.

Edit (Aug 2020):

The command has changed in the latest version. The following will do:

prism mock <your spec file>

It accepts swagger and postman doc as well.

Solution 2 - Mocking

SwaggerHub provides a mock server for OpenAPI 2.0 and 3.0 specs. Mocking is supported on both free and paid plans.

To use the mock server, import your spec into SwaggerHub and enable "API Auto Mocking". Mock responses can be JSON, YAML and XML, and are generated based on your response schemas and the example, default and enum values defined in the schemas.

Disclosure: I work for the company that makes SwaggerHub.

Solution 3 - Mocking

Imposter is a a scriptable, multipurpose mock server written in Java.

Very easy to setup in a Docker environment and provides a Swagger UI to play with your mock api.

Let's see an example setup

  1. Have a swagger configuration ready in a file in the folder config/petstore.yaml

     swagger: "2.0"
     info:
     version: 1.0.0
     title: Swagger Petstore
         .
         .
         .
    

You can copy the example swagger specification from here.

  1. Create a configuration file for Imposter in config/openapi-plugin-petstore-config.json

     {
       "plugin": "com.gatehill.imposter.plugin.openapi.OpenApiPluginImpl",
       "specFile": "petstore.yaml"
     }
    

    Name of the configuration file has to end with -config.json.

  2. Run Imposter with Docker

    Ensure that your shell is placed in the parent directory of config and run

     docker run -ti -p 8443:8443 \
     -v $(pwd)/config:/opt/imposter/config \
     outofcoffee/imposter-openapi
    
  3. Open <http://localhost:8443/_spec/> to play with your Mock Server and Swagger UI

    Imposter Mock API

Solution 4 - Mocking

Given the OpenAPI/Swagger spec, you can use Swagger Codegen to generate server stub in different server frameworks (e.g. Java Spring. PHP Slim, Ruby on Rails5, etc).

Here is the related documentation:

https://github.com/swagger-api/swagger-codegen/wiki/Server-stub-generator-HOWTO

UPDATE: In May 2018, about 50 top contributors of Swagger Codegen decided to fork the project to create a community-driven version called OpenAPI Generator. Please refer to the Q&A for the reasons behind the fork.

Solution 5 - Mocking

Here is the docker container for mock api server from swagger yaml.

docker run -i \
    -p 8000:8000 \
    -v /path/to/file.yaml:/data/swagger.yaml \
    -t palo/swagger-api-mock:latest

This is internally using swagger-mock-api

Solution 6 - Mocking

I docker composed Swagger Editor, Swagger UI and Swagger mock api server to handle them more easily. Check it out. There is a sample swagger spec in this so the Editor, UI and the mock API server will run without any configuration from the start. All you need to do is edit the swagger spec, save swagger.json and swagger.yaml, and restart docker.

swagger-all-in-one-docker-compose

Solution 7 - Mocking

Recently I have come across Microcks.io and it has helped me solve number of problems. Also found Apicur.io for editing/creating swagger files. A standard worth embrasing.

Solution 8 - Mocking

openapi-mock is a CLI wrapper for swagger-node-runner and sway specifically to start a mock server from an openapi/swagger spec file.

Solution 9 - Mocking

MockLab now supports auto-generation of mock APIs from an imported Swagger definition. And you can also set it up as a webhook received in Swaggerhub so it gets updated on every save/publish:

https://www.mocklab.io/blog/mocklab-now-supports-swagger-and-swaggerhub/

Solution 10 - Mocking

Mock Server project supports creating stubs based on Swagger/OpenAPI Specs.

https://www.mock-server.com/mock_server/using_openapi.html

Solution 11 - Mocking

I created mock api server myself that can server swagger.json file. It is very easy to setup locally if you have python installed.

Have a look at this: https://github.com/bikcrum/Mock-API-server

Just use this command to serve your swagger.json file which will create API endpoints based on specification on the swagger file.

Quick and straightforward
python app.py -s /path/to/swagger.json
Extended options
usage: app.py [-h] -s SOURCE [-p PORT] [-t {swagger}] [-sc STATUS_CODE] [-r RANDOM_SEED] [-d DEFAULT_VALUE [DEFAULT_VALUE ...]]
              [-l LIST_SIZE [LIST_SIZE ...]]

Options for mock responses

Required and optional arguments:
  -h, --help            show this help message and exit

  -s SOURCE, --source SOURCE
                        (Required) API reference source file path.
  
  -p PORT, --port PORT  (Optional,default=5000) Port number the app runs on.

  -t {swagger}, --type {swagger}
                        (Optional,default='swagger') Type of API reference. Currently only supports Swagger.

  -sc STATUS_CODE, --status_code STATUS_CODE
                        (Optional,default=200) Generates responses with status code provided.

  -r RANDOM_SEED, --random_seed RANDOM_SEED
                        (Optional) Generates random responses based on seed value.

  -d DEFAULT_VALUE [DEFAULT_VALUE ...], --default_value DEFAULT_VALUE [DEFAULT_VALUE ...]
                        (Optional) Sets default values in response body. Format key=value.

  -l LIST_SIZE [LIST_SIZE ...], --list_size LIST_SIZE [LIST_SIZE ...]
                        (Optional,default=[2]) Sets default size of list in response body.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrafakobView Question on Stackoverflow
Solution 1 - MockingArnaud LauretView Answer on Stackoverflow
Solution 2 - MockingHelenView Answer on Stackoverflow
Solution 3 - Mockingu2ixView Answer on Stackoverflow
Solution 4 - MockingWilliam ChengView Answer on Stackoverflow
Solution 5 - Mockingarulraj.netView Answer on Stackoverflow
Solution 6 - MockingChikara MatsudaView Answer on Stackoverflow
Solution 7 - MockingNavapView Answer on Stackoverflow
Solution 8 - MockingAlasdair McLeayView Answer on Stackoverflow
Solution 9 - MockingTomView Answer on Stackoverflow
Solution 10 - MockingSaikatView Answer on Stackoverflow
Solution 11 - MockingbikramView Answer on Stackoverflow