I use mock objects extensively in my unit testing. But now I need to mock a type that is Send
and Sync
, and I can't do it. None of the mock libraries I checked (galvanic_mock, mock-it, pseudo, double, mock_derive, mockers, and simulacrum) can do it. I've tried mucking around with the Fragile crate. With difficulty, I think I can get it working for Send
types, but not for Sync
ones. Has anybody run into this problem before?
Can you give a code example of something that's not working? That might make it easier for people to help point you in the right direction.
Here's a minimal example with Mockers. It doesn't work of course, which is why it's commented out. The basic idea is "create a mock for trait T, then turn it into a trait object for T + Send
.
https://github.com/asomers/mock_shootout/blob/198b89fc193d8b17f1b1b3e9c8c8cb64c1774853/src/t_mockers.rs#L431
But I came up with another "solution" after getting no response for 24h. My "solution" is incredibly lame. I use Simulacrum to create a mock structure, then cheat by implementing Send
! It's totally unsafe, but it works as long as my unit tests are all single-threaded. It looks a bit like this:
use simulacrum::Expectations;
pub struct MyMock {
e: Expectations
}
impl MyMock {
...
}
unsafe impl Send for MyMock {}
I can get away with this because my unit tests (which use mocks) are single-threaded, even though my functional tests (which don't) aren't.