首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用RxJava2和MutableLiveData进行单元测试

使用RxJava2和MutableLiveData进行单元测试
EN

Stack Overflow用户
提问于 2018-06-05 22:51:05
回答 1查看 509关注 0票数 2

我正在尝试对一些使用RxJava2的Android/Kotlin代码进行单元测试。代码大致如下:

代码语言:javascript
复制
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)
        }
}

但是,我得到了以下异常:

代码语言:javascript
复制
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.

每次我运行单元测试的时候。我读了很多tutorialsSO answers,但即使在使用了RxJavaPlugins之后,我似乎仍然无法模拟主线程调度器,并且仍然存在相同的异常。

有没有人可以看看我的单元测试类,并建议我这里遗漏了什么?

代码语言:javascript
复制
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线程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 23:21:37

您的RxJava配置正确,为了测试MutableLiveData,您需要在测试中设置规则:

代码语言:javascript
复制
@Rule
@JvmField
val rule = InstantTaskExecutorRule()

其中InstantTaskExecutorRule来自模块android.arch.core:core-testing (即将迁移到AndroidX) -目前最新版本是1.1.1。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50703029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档