MCPcopy Index your code
hub / github.com/LukeMathWalker/wiremock-rs

github.com/LukeMathWalker/wiremock-rs @v0.6.5

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.6.5 ↗ · + Follow
206 symbols 514 edges 21 files 107 documented · 52%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

wiremock

HTTP mocking to test Rust applications.

Crates.io version

Download

docs.rs docs

wiremock provides HTTP mocking to perform black-box testing of Rust applications that interact with third-party APIs.

It provides mocking of HTTP responses using request matching and response templating.

The name wiremock is a reference to WireMock.Net, a .NET port of the original Wiremock from Java.

Documentation - Crates.io

Table of Contents

  1. How to install
  2. Getting started
  3. Matchers
  4. Spying
  5. Responses
  6. Test isolation
  7. Runtime compatibility
  8. Efficiency
  9. Prior art
  10. Future evolution
  11. Related projects
  12. License

How to install

Add wiremock to your development dependencies by editing the Cargo.toml file:

[dev-dependencies]
# ...
wiremock = "0.6"

Or by running:

cargo add wiremock --dev

Getting started

use wiremock::{MockServer, Mock, ResponseTemplate};
use wiremock::matchers::{method, path};

#[async_std::main]
async fn main() {
    // Start a background HTTP server on a random local port
    let mock_server = MockServer::start().await;

    // Arrange the behaviour of the MockServer adding a Mock:
    // when it receives a GET request on '/hello' it will respond with a 200.
    Mock::given(method("GET"))
        .and(path("/hello"))
        .respond_with(ResponseTemplate::new(200))
        // Mounting the mock on the mock server - it's now effective!
        .mount(&mock_server)
        .await;

    // If we probe the MockServer using any HTTP client it behaves as expected.
    let status = reqwest::get(format!("{}/hello", &mock_server.uri()))
        .await
        .unwrap()
        .status();
    assert_eq!(status.as_u16(), 200);

    // If the request doesn't match any `Mock` mounted on our `MockServer` a 404 is returned.
    let status = reqwest::get(format!("{}/missing", &mock_server.uri()))
        .await
        .unwrap()
        .status();
    assert_eq!(status.as_u16(), 404);
}

Matchers

wiremock provides a set of matching strategies out of the box - check the [matchers] module for a complete list.

You can define your own matchers using the [Match] trait, as well as using Fn closures. Check [Match]'s documentation for more details and examples.

Spying

wiremock empowers you to set expectations on the number of invocations to your [Mock]s - check the [expect] method for more details.

Expectations can be used to verify that a side-effect has (or has not) taken place!

Expectations are automatically verified during the shutdown of each [MockServer] instance, at the end of your test. A failed verification will trigger a panic. By default, no expectations are set on your [Mock]s.

Responses

wiremock lets you specify pre-determined responses using [ResponseTemplate] and [respond_with].

You are also given the option to have [Mock]s return different responses based on the matched [Request] using the [Respond] trait. Check [Respond]'s documentation for more details and examples.

Test isolation

Each instance of [MockServer] is fully isolated: [start] takes care of finding a random port available on your local machine which is assigned to the new [MockServer].

To ensure full isolation and no cross-test interference, [MockServer]s shouldn't be shared between tests. Instead, [MockServer]s should be created in the test where they are used.

When a [MockServer] instance goes out of scope (e.g. the test finishes), the corresponding HTTP server running in the background is shut down to free up the port it was using.

Runtime compatibility

wiremock can be used (and it is tested to work) with both [async_std] and [tokio] as futures runtimes. If you encounter any compatibility bug, please open an issue on our GitHub repository.

Efficiency

wiremock maintains a pool of mock servers in the background to minimise the number of connections and the time spent starting up a new [MockServer]. Pooling reduces the likelihood of you having to tune your OS configurations (e.g. ulimit).

The pool is designed to be invisible: it makes your life easier and your tests faster. If you end up having to worry about it, it's a bug: open an issue!

Prior art

[mockito] and [httpmock] provide HTTP mocking for Rust.

Check the table below to see how wiremock compares to them across the following dimensions: - Test execution strategy (do tests have to be executed sequentially or can they be executed in parallel?); - How many APIs can I mock in a test? - Out-of-the-box request matchers; - Extensible request matching (i.e. you can define your own matchers); - Sync/Async API; - Spying (e.g. verify that a mock has/hasn't been called in a test); - Standalone mode (i.e. can I launch an HTTP mock server outside of a test suite?).

Test execution strategy How many APIs can I mock? Out-of-the-box request matchers Extensible request matching API Spying Standalone mode
mockito ✔ Parallel ✔ Unbounded Async/Sync
httpmock ✔ Parallel ✔ Unbounded Async/Sync
wiremock ✔ Parallel ️ ✔ Unbounded Async

Future evolution

More request matchers can be added to those provided out-of-the-box to handle common usecases.

Related projects

  • stubr for mounting Wiremock json stubs in a [MockServer]. Also works as a cli.

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Extension points exported contracts — how you extend this code

Match (Interface)
Anything that implements `Match` can be used to constrain when a [`Mock`] is activated. `Match` can be used to extend t [17 …
src/mock.rs
Respond (Interface)
Anything that implements `Respond` can be used to reply to an incoming request when a [`Mock`] is activated. ## Fixed r [2 …
src/respond.rs
RespondErr (Interface)
Like [`Respond`], but it only allows returning an error through a function. [1 implementers]
src/respond.rs

Core symbols most depended-on inside this repo

respond_with
called by 46
src/mock.rs
method
called by 46
src/matchers.rs
expect
called by 41
src/mock.rs
and
called by 40
src/mock.rs
register
called by 35
src/mock_set.rs
uri
called by 28
src/mock_server/bare_server.rs
path
called by 12
src/matchers.rs
mount
called by 10
src/mock.rs

Shape

Method 91
Function 71
Class 34
Enum 7
Interface 3

Languages

Rust100%

Modules by API surface

src/matchers.rs45 symbols
tests/mocks.rs22 symbols
src/mock.rs21 symbols
src/mock_server/bare_server.rs17 symbols
tests/request_header_matching.rs16 symbols
src/mock_set.rs16 symbols
src/mock_server/exposed_server.rs14 symbols
src/response_template.rs12 symbols
src/mounted_mock.rs7 symbols
src/mock_server/builder.rs7 symbols
src/request.rs5 symbols
src/verification.rs4 symbols

For agents

$ claude mcp add wiremock-rs \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact