我正在尝试对一些使用RxJava2的Android/Kotlin代码进行单元测试。代码大致如下:
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.
每次我运行单元测试的时候。我读了很多tutorials和SO answers,但即使在使用了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线程。
发布于 2018-06-05 23:21:37
您的RxJava配置正确,为了测试MutableLiveData
,您需要在测试中设置规则:
@Rule
@JvmField
val rule = InstantTaskExecutorRule()
其中InstantTaskExecutorRule
来自模块android.arch.core:core-testing
(即将迁移到AndroidX) -目前最新版本是1.1.1。
https://stackoverflow.com/questions/50703029
复制相似问题