Я пытаюсь выполнить модульное тестирование кода Android / Kotlin, использующего RxJava2.Код выглядит примерно следующим образом:
val temperature = MutableLiveData<Double>()
fun save(): Single<Result<ClassifyResponse>> {
val temp = temperature.value
...
return repository.classify(request)
.flatMap { response->
val result: Result<ClassifyResponse> = Result.Success(response)
Single.just(result)
}.onErrorReturn {
Result.Error(it)
}
}
Однако я получаю следующее исключение:
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
каждый раз, когда я запускаю свой модульный тест.Я прочитал множество учебных пособий и SO ответов , но даже после использования RxJavaPlugins мне все еще не удается смоделировать главный планировщик потоков, и преобладает то же исключение.
Может ли кто-нибудь взглянуть на мой класс модульных тестов и предложить, что мне здесь не хватает?
class MyViewModelTest() {
private val repository = mock(MyRepository::class.java)
private val immediateScheduler = object : Scheduler() {
override fun createWorker(): Worker {
return ExecutorScheduler.ExecutorWorker(Executor { it.run() })
}
}
@Before
fun setUp() {
RxJavaPlugins.setInitIoSchedulerHandler { immediateScheduler }
RxJavaPlugins.setComputationSchedulerHandler { immediateScheduler }
RxAndroidPlugins.setInitMainThreadSchedulerHandler { immediateScheduler }
RxAndroidPlugins.setInitMainThreadSchedulerHandler { immediateScheduler }
}
@Test
fun test() {
// given temperature view model
val viewModel = MyViewModel(repository)
...
val classifyResponse = ClassifyResponse(...)
`when`(repository.classify(any(ClassifyRequest::class.java))).then { Single.just(classifyResponse) }
// when sending request
val result = viewModel.save()
// then verify result
val expected = Result.success(classifyResponse)
assertEquals(expected, result)
}
}
РЕДАКТИРОВАТЬ: я заметил, что это происходит из-за использования MutableLiveData
.Когда я пытаюсь получить доступ к temperature.value
, он жалуется на поток MainLooper.