Я начал изучать модульный тест в android, и я пытаюсь выполнить http-запрос с Retrofit2 и RxJava2, но когда я выполняю текущий запрос, он никогда не заканчивается. Вот мой код TestCase:
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [Build.VERSION_CODES.O_MR1])
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class LoginPageTestCase {
@Rule
@JvmField
val rule: MockitoRule = MockitoJUnit.rule()
@Rule
@JvmField
var testSchedulerRule = RxImmediateSchedulerRule()
@Mock
lateinit var view: UserLoginContract.LoginView
@Spy
@InjectMocks
lateinit var presenter: UserLoginPresenterImpl
@Before
fun `init mocks`() {
MockitoAnnotations.initMocks(this)
}
@Test
fun `1 valid fields`() {
presenter.onAttach(view)
assert(presenter.view.isNotNull())
}
@Test
fun `2 try login`() {
val loginRequest = LoginRequest("orij@test.co.il", "Aa123!!!")
val loginRequestTestObserver = presenter.makeLoginRequest(loginRequest).test()
loginRequestTestObserver.apply {
awaitTerminalEvent()
assertNoErrors()
assertComplete()
assertValueCount(1)
}
loginRequestTestObserver.assertNoErrors().assertValue { it.userData.isNotNull() }
val userDetails = loginRequestTestObserver.values()[0]
assert(userDetails.isNotNull())
print("Show token: ${userDetails.userData.token}")
backToMainThread()
}
}
RxImmediateSchedulerRule :
class RxImmediateSchedulerRule : TestRule {
override fun apply(base: Statement, d: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
RxJavaPlugins.setComputationSchedulerHandler { Schedulers.trampoline() }
RxJavaPlugins.setNewThreadSchedulerHandler { Schedulers.trampoline() }
RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() }
try {
base.evaluate()
} finally {
RxJavaPlugins.reset()
RxAndroidPlugins.reset()
}
}
}
}
}
Примечание. То, что я пытаюсь проверить, - это реальный запрос и проверка всех полей.