我无法测试我的方法,感觉它没有到达 uiScope.launch 块内部,并且我已经发布了我正在尝试测试的 viewModel 方法,并且fetchActivationCodeWithDuration
是挂起功能。底部是我的测试类
我收到这条消息
java.lang.AssertionError:
Expected :ActivationCode(code=111111, expires=2019-05-23T10:03:50.614Z, duration=815960) Actual :null
protected val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
fun loadActivationCode() {
uiScope.launch {
progressMessageMutableData.postValue(true)
when (val result = activationCodeRepository.fetchActivationCodeWithDuration()) {
is Resource.Success<ActivationCode> -> {
progressMessageMutableData.postValue(false)
activationMutableData.postValue(result.data)
}
is Resource.Failure -> {
progressMessageMutableData.postValue(false)
errorMessageMutableData.postValue(result.message)
}
}
}
suspend fun fetchActivationCodeWithDuration(): Resource<ActivationCode> {}
这是我的测试课
@ExperimentalCoroutinesApi
@RunWith(JUnit4::class)
class ActivationViewModelTest {
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
@UseExperimental(ObsoleteCoroutinesApi::class)
private val mainThreadSurrogate = newSingleThreadContext("UI thread")
private lateinit var viewModel: ActivationViewModel
private lateinit var serverTimeFetcher: IServerTimeFetcher
private lateinit var activationCodeRepository: ActivationRepositoryCode
@Before
fun setup() {
viewModel = ActivationViewModel()
Dispatchers.setMain(mainThreadSurrogate)
activationCodeRepository = mock(ActivationRepositoryCode::class.java)
viewModel.activationCodeRepository = activationCodeRepository
}
@After
fun tearDown() {
Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher
mainThreadSurrogate.close()
}
@Test
fun whenSuccessMenuLoad_loadActivationCode() {
runBlockingTest {
Mockito.`when`(activationCodeRepository.fetchActivationCodeWithDuration()).
thenReturn(Resource.Success(ActivationCode(code = "111111", expires = "2019-05-23T10:03:50.614Z", duration = 815960L)))
viewModel.loadActivationCode()
val expected = ActivationCode(code = "111111", expires = "2019-05-23T10:03:50.614Z", duration = 815960L)
val actual = viewModel.activationData.value
Assert.assertEquals(expected, actual)
}
}
}
更好的方法是将 coroutineDispatcher 传递给 viewModel,这样您就可以在测试中传递测试调度程序。所以你应该有:
class ActivationViewModel(val dispatcher:CoroutineDispatcher){}
在您的测试中,您可以像这样初始化 viewModel :
val dispatcher=Dispatchers.Unconfined
val viewModelInTest=ActivationViewModel(dispatcher)
问题将会得到解决..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)