Android 为什么使用协程延迟()的单元测试失败?
我有一段代码,我确实想测试Android 为什么使用协程延迟()的单元测试失败?,android,kotlin,kotlin-coroutines,Android,Kotlin,Kotlin Coroutines,我有一段代码,我确实想测试loadSession(),testLoadSession()是我的测试方法SuccessActivationCodeRepository用于单元测试,observeForesting是扩展函数 您可以看到,我在单元测试中添加了更长的延迟,但这无助于它为sessionData返回null,我如何解决这个问题 fun loadSession(activationCode: ActivationCode) { viewModelScope.launch {
loadSession()
,testLoadSession()
是我的测试方法SuccessActivationCodeRepository
用于单元测试,observeForesting
是扩展函数
您可以看到,我在单元测试中添加了更长的延迟,但这无助于它为sessionData返回null,我如何解决这个问题
fun loadSession(activationCode: ActivationCode) {
viewModelScope.launch {
delay(START_DELAY)
when (val result = activationCodeRepository.fetchSession(activationCode)) {
is Response.Success<ISession> -> {
sessionMutableData.postValue(result.data)
}
is Response.Failure -> {
if (result.message == ERROR_RETRY_ACTIVATION) {
retryActivationMutableData.postValue(true)
} else {
errorMessageMutableData.postValue(ConsumableValue(result.message))
}
}
}
}
}
@Test
fun testLoadSession() {
viewModel.activationCodeRepository = SuccessActivationCodeRepository()
val activationCode = ActivationCode()
val expectedSession = Session("", "", "")
viewModel.loadSession(activationCode)
runBlocking {
delay(10000L)
}
viewModel.sessionData.observeForTesting {
assertThat(viewModel.sessionData.value?.sessionToken).isEqualTo(expectedSession.sessionToken)
}
}
class SuccessActivationCodeRepository : IActivationCodeRepository {
override suspend fun fetchSession(activationCode: ActivationCode): Response<ISession> {
return Response.Success(Session())
}
}
fun <T> LiveData<T>.observeForTesting(block: () -> Unit) {
val observer = Observer<T> { Unit }
try {
observeForever(observer)
block()
} finally {
removeObserver(observer)
}
}
乐趣加载会话(激活代码:激活代码){
viewModelScope.launch{
延迟(启动延迟)
当(val result=activationdeposition.fetchSession(activationCode)){
是回应。成功->{
sessionMutableData.postValue(result.data)
}
是响应。失败->{
if(result.message==错误\u重试\u激活){
retryActivationMutableData.postValue(true)
}否则{
errorMessageMutableData.postValue(ConsumableValue(result.message))
}
}
}
}
}
@试验
有趣的testLoadSession(){
viewModel.activationCodeRepository=SuccessActivationCodeRepository()
val activationCode=activationCode()
val expectedSession=会话(“,”“,”“)
viewModel.loadSession(激活代码)
运行阻塞{
延迟(10000升)
}
viewModel.sessionData.ObserveForesting{
assertThat(viewModel.sessionData.value?.sessionToken).isEqualTo(expectedSession.sessionToken)
}
}
类SuccessActivationCodeRepository:IActivationCodeRepository{
覆盖挂起会话(activationCode:activationCode):响应{
返回Response.Success(会话())
}
}
趣味LiveData.ObserveForesting(块:()->单位){
val observer=观察者{Unit}
试一试{
观察者(观察者)
块()
}最后{
removeObserver(观察员)
}
}
我添加了coroutinestrule.testDispatcher.runBlockingTest{}和advanceTimeBy(20000L),并在loadSession()中设置了大于延迟时间的时间
@Test
fun testLoadSession() {
viewModel.activationCodeRepository = SuccessActivationCodeRepository()
val activationCode = ActivationCode()
val expectedSession = Session()
coroutinesTestRule.testDispatcher.runBlockingTest {
viewModel.loadSession(activationCode)
viewModel.sessionData.observeForTesting {
advanceTimeBy(20000L)
assertThat(viewModel.sessionData.value.sessionToken).isEqualTo(expectedSession.sessionToken)
}
}
}```