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.
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.
Next part we’ll wrap things up testing the ViewModel and the LiveData associated with it to get a complete picture.