best practices for unit testing rxjava
TRANSCRIPT
![Page 1: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/1.jpg)
Best practices for unit testing RxJava
Simon Perčič, senior Android developer
Tuesday, November 8th, 2016 @ 18:00
![Page 2: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/2.jpg)
RxJava?
● Useful for combining, transforming, manipulating streams of data
● How to unit test?
![Page 3: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/3.jpg)
What to unit test?
● Observables - composition of operators
● Code that uses Rx (e.g. presenters)
![Page 4: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/4.jpg)
Let’s set an example
![Page 5: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/5.jpg)
What will we test?
![Page 6: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/6.jpg)
What will we test?
DataManager methods:
![Page 7: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/7.jpg)
Tip #1 (testability)
![Page 8: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/8.jpg)
Tip #1Separate data providers
![Page 9: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/9.jpg)
Test skeleton 1/3
mocked
subject of testing
![Page 10: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/10.jpg)
Test skeleton 2/3
![Page 11: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/11.jpg)
Test skeleton 3/3
![Page 12: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/12.jpg)
Test examples*
* not best practices
![Page 13: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/13.jpg)
Wrong test #1
Works. → But only if getPlanets() is run on the immediate thread
![Page 14: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/14.jpg)
Wrong test #1
Works. → But only if getPlanets() is run on the immediate thread
![Page 15: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/15.jpg)
Not immediate thread
Runs on another thread!
![Page 16: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/16.jpg)
Wrong test #1 - on another thread
Fails. → getPlanets() switches thread, Assert happens “too soon”
![Page 17: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/17.jpg)
Wrong test #2 - blocking
Works. → it waits for the getPlanets() single to complete.
![Page 18: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/18.jpg)
Wrong test #2 - countdown
Blocks here
![Page 19: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/19.jpg)
Tip #2 (threading)
![Page 20: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/20.jpg)
Tip #2
Single / Observable transformer
Network thread
![Page 21: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/21.jpg)
Tip #2 - in manager
Compose with scheduler transformer
![Page 22: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/22.jpg)
Tip #2 - in test
No op transformation.
![Page 23: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/23.jpg)
Tip #3 (the big one)*
* best practices
![Page 24: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/24.jpg)
Built-in classes
● TestSubscriber
● TestScheduler
● TestSubject
![Page 25: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/25.jpg)
Tip #3 [1/3] - TestSubscriber
● Subscriber with additional test methods
● Part of RxJava
![Page 26: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/26.jpg)
TestSubscriber example
![Page 27: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/27.jpg)
● Blocking○ awaitTerminalEvent()
TestSubscriber methods
Will block
![Page 28: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/28.jpg)
● Assertions○ Completion
■ assertCompleted() / assertNotCompleted()■ assertTerminalEvent() / assertNoTerminalEvent()
TestSubscriber methods
![Page 29: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/29.jpg)
● Assertions○ Errors
■ assertNoErrors()■ assertError(Class / Throwable)
TestSubscriber methods
![Page 30: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/30.jpg)
● Assertions○ Values
■ assertNoValues()■ assertValueCount(int)■ assertValue(T) / assertValues(T…)
TestSubscriber methods
![Page 31: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/31.jpg)
● Get values○ Values
■ List<T> getOnNextEvents()○ Errors
■ List<Throwable> getOnErrorEvents()
TestSubscriber methods
![Page 32: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/32.jpg)
Tip #3 [2/3] - TestScheduler
![Page 33: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/33.jpg)
● Time “manipulation”○ Advance time
■ advanceTimeBy(long, TimeUnit)■ advanceTimeTo (long, TimeUnit)
○ Force trigger■ triggerActions()
TestScheduler methods
![Page 34: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/34.jpg)
Tip #3 [3/3] - TestSubject
● Enables us to queue events with a delay○ onNext(T, delayMs)○ onCompleted(delayMs)○ onError(Throwable, delayMs)
![Page 35: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/35.jpg)
TestSubject - setup
![Page 36: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/36.jpg)
TestSubject - test
![Page 37: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/37.jpg)
● Use RxJava
● Make your code unit-testable
● Be aware of threading
● Use built-in testing utils
Recap
![Page 38: Best practices for unit testing RxJava](https://reader034.vdocuments.mx/reader034/viewer/2022051318/58efbb571a28ab96638b461d/html5/thumbnails/38.jpg)
Questions?
@simonpercic @simonpercicsimonpercic