I had a complicated bit of logic that involved multiple threads, waiting for the right time, checking for time expiration, etc. I wanted to unit test it, which meant mocking Time. And not in a simple way, but in a complex, works-across-threads way.
This is what I ended up with:
That’s pretty simple. The fun stuff happens in the Stub version:
Thus my logic component, which spawns multiple threads, each of which take a section of work to do, and each unit of work has “cannot start before” and “must not end after” – when it runs it against unit tests, it runs it at 100x or 1000x normal speed – but the simulation is accurate across all the threads.