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)
      }
    }
  }```