Testing asynchronous systems is not an easy task. Let's take a simple example:
We have a class that creates file based on a given file name. The interesting thing is, that it does it asynchronously using a thread pool and returns immediately to the caller.
Let's try to create a test for it. Our first attempt could look like that:
The horrible thing about it is that Thread.sleep() invocation. Test should be fast, making them wait unnecessary is very poor solution. And what if the test sometimes fails because of overloaded hardware? Are we going to sleep even more?
To eliminate unneeded waiting, we may come up with a concept of validator:
We no longer need to sleep for a long time, but the code has been significantly polluted. Of course we can refactor our validator, make it more reusable but why reinvent the wheel? There is a nice and small library - awaitility - that will do the same for us.
In a very expressive way, we achieve the same result. Timeout, polling delay and polling interval are of course configurable.