Blocking calls are named that way because the execution waits until the call has finished. Most blocking calls just have to finish some processing without external interaction and then continue the execution con the caller.
The problem with testing blocking calls is that executing them in tests will block (obviously) them and not finish. No matter what, you’ll need at least two threads: one will get blocked and the other will do the unblocking action. Now, you can decide where to put those threads: in test code or in production code.
An example of doing it in tests from my http-server:
Another example of doing it in code from my http-server