The Startup
Published in

The Startup

On testing — Kotlin Coroutines

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

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. Follow to join The Startup’s +8 million monthly readers & +756K followers.

Recommended from Medium

Flutter Widget

Convert Android runtime permission callbacks into kotlin coroutines

Step 7 — Triple Shot Powerup

Continuous deployment (CD) for an Android app using Github Action

Build an Animated Switch/Toggle in Flutter.

[59] Our app is live on Android

Integration of Huawei Account Kit, ML Kit, and Ads Kit in Travel Buddy Apps​

Compiler code in Android

Get the Medium app

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
Costa Fotiadis

Costa Fotiadis

Android dude @JustEatUK

More from Medium

How to Mute Audio and Adjust Volume During a Video Call in Android Using the Agora SDK

Android Paintflags Configuration, Explained

How to Display item names on spinner but select IDs only.

Start with GraphQL in baby steps for Android