use std::path::PathBuf; use ridicule::mock; trait Foo { fn do_something(&self, cb: Callback) where Callback: Fn(u64) -> String; fn do_something_else(&self, cb: Callback) where Callback: Fn(f32) -> Value; } mock! { MockFoo {} impl Foo for MockFoo { fn do_something(&self, cb: Callback) where Callback: Fn(u64) -> String; fn do_something_else(&self, cb: Callback) where Callback: Fn(f32) -> Value; } } fn main() { let mut mock_foo = MockFoo::new(); unsafe { mock_foo .expect_do_something() .returning(|_me, cb: fn(_) -> _| { println!("do_something was called"); let cb_res = cb(42); println!("Received '{cb_res}' from callback"); }); } unsafe { mock_foo .expect_do_something_else() .returning(|_me, cb: fn(_) -> PathBuf| { println!("do_something_else was called"); let cb_res = cb(255.255); println!("Received '{}' from callback", cb_res.display()); }); } mock_foo.do_something((|num| format!("Hello there {num}")) as fn(_) -> _); mock_foo.do_something_else((|_| PathBuf::from(r"a/b/c.txt")) as fn(_) -> _); }