I can spell banana but I never know when to stop.
—Johnny Mercer (songwriter)
Some tests must cope with asynchronous behavior—whether they’re end-to-end tests probing a system from the outside or, as we’ve just seen, unit tests exercising multithreaded code. These tests trigger some activity within the system to run concurrently with the test’s thread. The critical difference from “normal” tests, where there is no concurrency, is that control returns to the test before the tested activity is complete—returning from the call to the target code does not mean that it’s ready to be checked.
For example, this test assumes that a
Set has finished adding an element when the
add() method returns. Asserting ...