Macro mockall::mock

mock!() { /* proc-macro */ }
Expand description

Manually mock a structure.

Sometimes automock can’t be used. In those cases you can use mock!, which basically involves repeating the struct’s or trait’s definitions.

The format is:

  • Optional visibility specifier
  • Real structure name and generics fields
  • 0 or more methods of the structure, written without bodies, enclosed in a {} block
  • 0 or more impl blocks implementing traits on the structure, also without bodies.

§Examples

Mock a trait. This is the simplest use case.

trait Foo {
    fn foo(&self, x: u32);
}
mock!{
    pub MyStruct<T: Clone + 'static> {
        fn bar(&self) -> u8;
    }
    impl Foo for MyStruct {
        fn foo(&self, x: u32);
    }
}

When mocking a generic struct’s implementation of a generic trait, use the same namespace for their generic parameters. For example, if you wanted to mock Rc, do

mock!{
    pub Rc<T: 'static> {}
    impl<T: 'static> AsRef<T> for Rc<T> {
        fn as_ref(&self) -> &T;
    }
}

not

mock!{
    pub Rc<Q: 'static> {}
    impl<T: 'static> AsRef<T> for Rc<T> {
        fn as_ref(&self) -> &T;
    }
}

Associated types can easily be mocked by specifying a concrete type in the mock!{} invocation.

mock!{
    MyIter {}
    impl Iterator for MyIter {
        type Item=u32;

        fn next(&mut self) -> Option<<Self as Iterator>::Item>;
    }
}