On testing — Kotlin Coroutines

Or how to pretend you know what you are doing on pull requests

Costa Fotiadis
Jan 19, 2020 · 2 min read

This is part of a series head-scratching my way into coroutines. It can be read as a standalone although you are missing out on some stale memes on the other one:

Where we left off

The little repository class fetching a Reddit post works fine (?!) and your pull request is ready.

Hol’ up ❗

🐱‍👤 The gods of code review will not be satisfied until some semblance of code coverage is there. They can then go home and sleep soundly, knowing that this piece of art is perfectly safe to go on production 🐱‍👤

Get some dependencies first

Enter the CoroutineTestRule

We need some kind of test rule class that will do all the work for us on every test so you don’t have to copy-paste the same code everywhere.

Remember, DispatcherProvider is our own little interface:

This test rule is going to take care of running our tests on the TestCoroutineDispatcher, cleaning up after they are done so there’s no memory leaks messing with your YouTube watching.

A few more words on the other stuff:

  • @ExperimentalApi is there to stop editor warning messages. (truly cutting edge work going on here)
  • TestCoroutineDispatcher is included in the kotlinx.coroutines.test library. It’s exactly what it says on the tin and provides some additional functionality to make testing easier.
  • Since we are using our own DispatcherProvider we need a way to provide the TestCoroutineDispatcher into any class that we want to test. The testDispatcherProvider takes care of that.

Setting up

Let’s get a test with this rule inside.

Note that the dispatcher for RedditRepository is provided by the coroutineTestRule.

Any other dependencies that RedditRepository might want can easily be mocked but that’s not the point here.

Am I testing yet?

You can even avoid calling coroutinesTestRule.testDispatcher.runBlockingTest by creating an extension function:

The TestCoroutineDispatcher also has a few cool methods like advanceTimeBy(millis: Long) in case you are testing time sensitive code.

The end?

Next part we’ll wrap things up testing the ViewModel and the LiveData associated with it to get a complete picture.


Get smarter at building your thing. Join The Startup’s +786K followers.

Sign up for Top 10 Stories

By The Startup

Get smarter at building your thing. Subscribe to receive The Startup's top 10 most read stories — delivered straight into your inbox, once a week. Take a look.

By signing up, you will create a Medium account if you don’t already have one. Review our Privacy Policy for more information about our privacy practices.

Check your inbox
Medium sent you an email at to complete your subscription.

Costa Fotiadis

Written by

The Startup
Costa Fotiadis

Written by

Android dude @JustEatUK

The Startup

Get smarter at building your thing. Follow to join The Startup’s +8 million monthly readers & +786K followers.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store