개발+IT

[Android] 유닛테스트 작성시 RxJava Scheduler 처리

안드로이드 개발 중 테스트 코드를 실행할 때 Scheduler 처리를 해놓지 않으면 RxJava로 작성된 실 코드상에서 관련 오류가 마주치게 된다. 발생하는 오류 메시지는 주로 다음과 같다.

간단히 말하면 Instrumental 테스트가 아니기 때문에 Android Main Thread를 쓸 수 없는 상황이기 때문에 발생하는 오류이다.

이를 해결하기 위해서는 RxJavaPlugins, RxAndroidPlugins로 Scheduler를 제공해주면 된다. 제공해주는 방법에는 몇가지가 있지만, 가장 간편하고 여기저기 쓰기 좋은 테스트 Rule을 작성하는 법만 알아본다.

Schedulers.trampoline() 은 지연시간 없이 순차적으로 실행해주는 Scheduler이다. 위 구문은 RxJavaPlugins와 RxAndroidPlugins를 통해 스케쥴러 전환 없이 하나의 스레드에서 작업이 순차적으로 진행되도록 만들어준다. 사실 RxAndroidPlugins.setInitMainThreadSchedulerHandler만 호출해도 맨 위에서 발생한 오류는 일어나지 않을텐데, 수월한 테스팅을 위해서 모든 스케쥴러 전환에 적용시킨다고 생각하면 될 것 같다. 그리고 당연하게도, try / finally 구문을 통해 각 Plugins 세팅을 재설정해준다.

부록: AAC에서도 동일 오류가 발생할 때

Android Architecture Component를 쓰면서도 비슷한 상황이 발생할 수 있다. 예를 들자면 LiveData에 postValue를 통해 값을 전달할 때가 그렇다. postValue 코드를 까보면 main thread로 값을 전달하는 부분이 있는데, 위에서 오류가 발생했을 때와 동일하게 Instrumental 테스트가 아니기 때문에 오류를 뱉는 것이다. 이 경우에는 Rule을 구현하고 자시고 할 것 없이 구글에서 제공해주는 것을 쓰면 된다.

InstantTaskExecutorRule은 구글에서 제공하는 테스팅 라이브러리에 포함되어있다. 클래스 정의를 읽어보면 다음과 같다.

A JUnit Test Rule that swaps the background executor used by the Architecture Components with a different one which executes each task synchronously. You can use this rule for your host side tests that use Architecture Components.

AAC에서 백그라운드 익스큐터를 쓰는 경우에 사용하기 위한 JUnit Test Rule이라고 써있다. 이것까지 적용하면 문제를 맨 위에서 맞닥뜨렸던 오류를 마주칠 일은 없다고 보면 된다. 해피 코딩!


참고

How to unit test your RxJava code in Kotlin

How To Unit Test LiveData and Lifecycle Components

GAE BAL JA

구본본 님의 창작활동을 응원하고 싶으세요?

hell yeah, world
hell yeah, world
구독자 71
멤버십 가입

2개의 댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
새로운 알림이 없습니다.