How to test debounce in RxJava 2?

“Hand holding a reflective glass orb near an arched hallway” by Michal Lomza on Unsplash

Welcome to my problem-solving blog series! I will describe here common obstacles, which you can face while developing Android apps, and try to give you simple solutions to overcome these difficulties.

Let’s say you have a search bar in your app. A common approach of implementing such a feature is by having an observable, which emits input from edit text and using debounce operator from RxJava 2 to not perform searching every time user types in a single letter. Instead, it will wait a certain amount of time between emitting events. Below, you can see a function from SearchRepository, it’s quite straightforward:

So, as a good citizen of the programming world, we would like to write a unit test for that behavior. First thought? Let’s do something like that:

Simple, isn’t it? Unfortunately, we’ll get this result:

So, what happened here, is that our testObserver didn’t get any results, because of the debounce operator which is waiting for certain timeout and assert checks the value immediately. If only we could move time somehow…

Luckily for us, we can do that! We only need to do 2 things. First, specify on what scheduler our debounce is working by adding it as a third parameter. By default it’s Schedulers.computation, we can inject it for example into our SearchRepository.

Second thing, in our test use TestScheduler and pass it to the SearchRepository. That way we’re in control of the time! Just call advanceTimeBy function and advance it by the DEBOUNCE_TIMEOUT. Et voilà! Now our test will pass smoothly.

In case you wanted to test emitting few events one after another, simply just use advanceTimeBy function after each one to move the time and assert if the values are correct.

I hope this post will save you some time on googling and going through all these StackOverflow answers. I’m looking forward to your feedback and wait for next posts in my problem-solving blog series! :)



Android Dev @ Intive

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