#[automock]
Expand description
Automatically generate mock types for structs and traits.
This is by far the easiest way to use Mockall. It works on almost all
traits, and almost all structs that have a single impl
block. In either
case, it will generate a mock struct whose name is the name of the mocked
struct/trait prepended with “Mock”. For each method of the original, the
mock struct will have a method named expect_whatever
that allows you to
set expectations. There will also be one checkpoint
method that calls
checkpoint
for every single mocked method.
Examples
The simplest use case is mocking a no-frills trait
#[automock]
pub trait Foo {
fn foo(&self, key: i16);
}
let mock = MockFoo::new();
Mocking a structure:
struct Foo {}
#[automock]
impl Foo {
fn foo(&self) -> u32 {
// ...
}
}
You can also mock a trait impl on a struct:
pub trait Foo {
fn foo(&self, key: i16);
}
struct Bar{}
#[automock]
impl Foo for Bar {
fn foo(&self, key: i16){
// ...
}
}
let mock = MockBar::new();
Mocking a trait with associated types requires adding a metaitem to the attribute:
#[automock(type Item=u32;)]
trait Foo {
type Item;
fn foo(&self) -> Self::Item;
}
Finally, #[automock]
can also mock foreign functions. This requires
another metaitem to specify the mock module name.
#[automock(mod mock_ffi;)]
extern "C" {
pub fn foo() -> u32;
}
Limitations
#[automock]
can’t handle everything. There are some cases where
you will need to use mock
instead:
- Mocking a struct that has multiple
impl
blocks, including structs that implement traits. - Mocking a struct or trait defined in another crate.
- Mocking a trait with trait bounds.
- If the autogenerated “MockFoo” name isn’t acceptable, and you want to choose your own name for the mock structure.