Si vous le faites normalement, vous obtiendrez ExceptionInitializerError
dans la partie ```AndroidSchedulers.mainThread () `` `.
C'est parce que le planificateur retourné par ```AndroidSchedulers.mainThread () `` `dépend d'Android. (Si vous dépendez d'Android et ne faites rien, vous devez l'exécuter sur Android Test à l'aide d'un émulateur.) Ce lien vers la source correspondante Je vais.
Vous pouvez contourner ce problème en l'initialisant simplement en tant que planificateur séparé avec le mécanisme RxAndroidPlugins avant l'exécution du test.
Voici la source de kotlin. Utilisez simplement le mécanisme Plugin pour définir une TestRule qui rend simplement le Scheduler utilisé indépendamment d'Android.
RxImmediateSchedulerRule.kt
class RxImmediateSchedulerRule : TestRule {
private val immediate = object : Scheduler() {
override fun scheduleDirect(run: Runnable, delay: Long, unit: TimeUnit): Disposable {
return super.scheduleDirect(run, 0, unit)
}
override fun createWorker(): Worker {
return ExecutorScheduler.ExecutorWorker { it.run() }
}
}
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
RxJavaPlugins.setInitIoSchedulerHandler({ _ -> immediate })
RxJavaPlugins.setInitComputationSchedulerHandler({ _ -> immediate })
RxJavaPlugins.setInitNewThreadSchedulerHandler({ _ -> immediate })
RxJavaPlugins.setInitSingleSchedulerHandler({ _ -> immediate })
RxAndroidPlugins.setInitMainThreadSchedulerHandler({ _ -> immediate })
try {
base.evaluate()
} finally {
RxJavaPlugins.reset()
RxAndroidPlugins.reset()
}
}
}
}
}
Et faites-le juste avant de tester. Au fait, veuillez vous référer à cet article pour la raison pour laquelle vous n'utilisez pas `` @ ClassRule ''.
@RunWith(PowerMockRunner::class)
@PrepareForTest(Auth::class)
class LoginViewModelTest {
@Rule
val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
// companion object {
// @JvmField
// @ClassRule
// val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
// }
@Test
fun onClickLogin() {
val mockAuth = PowerMockito.mock(Auth::class.java)
val target = LoginViewModel(mockAuth)
target.mail.set("email")
target.password.set("password")
val result = Single.just(AuthEntity().apply {
accessToken = "123456"
userId = 100
})
PowerMockito.`when`(mockAuth.login("email", "password")).thenReturn(result)
target.onClickLogin().run()
Mockito.verify(mockAuth).login("email", "password")
}
}
Recommended Posts