use mockiato::mockable; #[mockable] trait Greeter: GreeterClone { fn greet(&self, name: &str) -> String; } trait GreeterClone { fn clone_box<'a>(&self) -> Box where Self: 'a; } impl GreeterClone for T where T: Greeter + Clone, { fn clone_box<'a>(&self) -> Box where Self: 'a, { Box::new(self.clone()) } } #[test] fn cloneable_mocks_work() { let name = String::from("Tom"); let mut greeter = GreeterMock::new(); greeter .expect_greet(|arg| arg.partial_eq(&name)) .times(2) .returns(String::from("Hello Tom")); assert_eq!("Hello Tom", greeter.greet("Tom")); { let greeter_clone = greeter.clone_box(); assert_eq!("Hello Tom", greeter_clone.greet("Tom")); } assert_eq!("Hello Tom", greeter.greet("Tom")); }