mocktail is a minimal crate for mocking HTTP and gRPC servers in Rust, with native support for streaming.
- Mocks HTTP and gRPC servers
- Mocks defined in Rust using a simple, ergonomic API
- Provides first-class support for streaming
- Supports gRPC unary, client-streaming, server-streaming, and bidirectional-streaming methods
- Match requests to mock responses using built-in matchers or custom matchers
- Fully asynchronous
Add
mocktailtoCargo.tomlas a development dependency:[dev-dependencies] mocktail = "0.3.1"
Basic usage example:
use mocktail::prelude::*;#[tokio::test]asyncfntest_example() -> Result<(),Box<dyn std::error::Error>>{// Create a mock setletmut mocks = MockSet::new();// Build a mock that returns a "hello world!" response// to POST requests to the /hello endpoint with the text "world"// in the body. mocks.mock(|when, then| { when.post().path("/hello").text("world"); then.text("hello world!");});// Create and start a mock serverletmut server = MockServer::new_http("example").with_mocks(mocks); server.start().await?;// Create a clientlet client = reqwest::Client::builder().http2_prior_knowledge().build()?;// Send a request that matches the mock created abovelet response = client .post(server.url("/hello")).body("world").send().await?;assert_eq!(response.status(), http::StatusCode::OK);let body = response.text().await?;assert_eq!(body,"hello world!");// Send a request that doesn't match a mocklet response = client.get(server.url("/nope")).send().await?;assert_eq!(response.status(), http::StatusCode::NOT_FOUND);// Mocks can also be registered to the server directly// Register a mock that will match the request above that returned 404 server.mock(|when, then| { when.get().path("/nope"); then.text("yep!");});// Send the request again, it should now matchlet response = client.get(server.url("/nope")).send().await?;assert_eq!(response.status(), http::StatusCode::OK);let body = response.text().await?;assert_eq!(body,"yep!");// Mocks can be cleared from the server, enabling server reuse server.mocks.clear();Ok(())}
See examples in the mocktail-tests crate.
This crate takes inspiration from other great mocking libraries including: