Модульное тестирование с использованием RxJava2 и MutableLiveData - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь выполнить модульное тестирование кода 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.

1 Ответ

0 голосов
/ 05 июня 2018

Ваш RxJava настроен правильно, и для тестирования MutableLiveData вам необходимо установить правило в своих тестах:

@Rule
@JvmField
val rule = InstantTaskExecutorRule()

, где InstantTaskExecutorRule поступает из модуля android.arch.core:core-testing (скоро будет переведен на AndroidX) - на данный момент последняя версия 1.1.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...