Room and coroutines testing


My last article covered some simple example about Room and RxJava instrumentation testing code. Coroutines also have great support in unit testing even though todays topic has nothing to do with it.  What I mean is that we are not going to cover runBlockingTest this time. Android doesn't support that (correct me if I'm wrong please) yet. However, I could schedule a topic about that because it really makes me excited. You can also check this awesome talk from Sean McQuillan, which I found pretty helpful.

Comparing to the last gists, we will try to jump from Rx to coroutines (without implementation) and write test class about it.  Instead of RxJava components, we can just mark methods as suspended:

This looks easier (or better say less confusing).

Two small notes that might be needed: 
Looking the code in the previous article, notice that you won't be needing the InstantTaskExecutorRule() and suddenly we won't be running the queries on the Main thread. That's because we can't do that if methods are marked as suspended.

Let's start testing:


Notice that we dropped the allowMainThreadQueries().

And now the queries:

Something too familiar? The key ingredient here is just a runBlocking keyword, which makes sure to run your suspending methods. I guess there is no need to add code for the update or delete part of testing. It's just super imperative and there is no secret here which could make you lose your mind (referring to the Rx-Javas blockingawait()) because a coroutine makes sure that the insertion is executed before the code below.


Not a small comparison:

I love both. But I think that Rx is really redundant when we are inside the Kotlin (especially coroutines) context.

Conclusion

Coroutines are being every day more supported by Google Android team and that's really great. New libraries are being written in Kotlin and coroutines are part of them. What I really like about Room and coroutines in testing is that I never deliberately forget to test Daos on my project, I'm always ready to write tests (even though I haven't been around testing in more than 8 months).

Note: If you want to know more about Room + coroutines, here is a nice article from Florina Muntenescu also covering some deep dive and behind the scenes on how Room Coroutine support has been build.

Stavro Xhardha