Bug: 310600239

Clone this repo:
  1. eeaf11f Migrate 25 crates to monorepo. am: f18dab4423 by James Farrell · 5 months ago main
  2. f18dab4 Migrate 25 crates to monorepo. by James Farrell · 5 months ago
  3. a15b370 Update Android.bp by running cargo_embargo am: de3a65afe0 by James Farrell · 6 months ago
  4. de3a65a Update Android.bp by running cargo_embargo by James Farrell · 6 months ago
  5. 70a3590 Update Android.bp by running cargo_embargo am: 184a6c4c38 am: acf2985fe0 by James Farrell · 8 months ago android15-tests-dev aml_art_350913340 aml_art_351011240 aml_art_351011340 aml_art_351110180 aml_cbr_350910020 aml_cbr_351011020 aml_doc_350915120 aml_doc_351012120 aml_ext_350912020 aml_hef_350921160 aml_hef_351016140 aml_med_350914000 aml_med_351010060 aml_net_350911020 aml_net_351010000 aml_net_351010020 aml_per_350910080 aml_per_351014000 aml_res_351011000 aml_rkp_350910000 aml_rkp_351011000 aml_sdk_350910000 aml_sta_350911020 aml_tet_350911120 aml_tet_351010220 aml_uwb_350911040 aml_uwb_351011040 aml_wif_350912040 aml_wif_351010040

Mockall

A powerful mock object library for Rust.

Build Status Crates.io Documentation

Overview

Mock objects are a powerful technique for unit testing software. A mock object is an object with the same interface as a real object, but whose responses are all manually controlled by test code. They can be used to test the upper and middle layers of an application without instantiating the lower ones, or to inject edge and error cases that would be difficult or impossible to create when using the full stack.

Statically typed languages are inherently more difficult to mock than dynamically typed languages. Since Rust is a statically typed language, previous attempts at creating a mock object library have had mixed results. Mockall incorporates the best elements of previous designs, resulting in it having a rich feature set with a terse and ergonomic interface. Mockall is written in 100% safe and stable Rust.

Usage

Typically mockall is only used by unit tests. To use it this way, add this to your Cargo.toml:

[dev-dependencies]
mockall = "0.12.1"

Then use it like this:

#[cfg(test)]
use mockall::{automock, mock, predicate::*};
#[cfg_attr(test, automock)]
trait MyTrait {
    fn foo(&self, x: u32) -> u32;
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn mytest() {
        let mut mock = MockMyTrait::new();
        mock.expect_foo()
            .with(eq(4))
            .times(1)
            .returning(|x| x + 1);
        assert_eq!(5, mock.foo(4));
    }
}

See the API docs for more information.

Minimum Supported Rust Version (MSRV)

Mockall is supported on Rust 1.64.0 and higher. Mockall's MSRV will not be changed in the future without bumping the major or minor version.

License

mockall is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE, and LICENSE-MIT for details

Acknowledgements

Mockall was not built in a day. JMock was probably the first popular mock object library. Many ports and imitations have been made, including GoogleMock for C++. Mockers, inspired by GoogleMock, was the first attempt to bring the concept to Rust. The now-defunct Mock_derive was the first library to generate mock objects with procedural macros, greatly reducing the user‘s workload. Mockall also uses proc macros, and copies many of Mockers’ features and conventions. Mockall also takes inspiration from Simulacrum's internal design, and its technique for mocking generic methods.