为什么使用协程延迟()的单元测试失败?

I.S*_*I.S 5 android kotlin kotlin-coroutines

我有这段代码我确实想测试loadSession(),正在testLoadSession()测试我用于单元测试的方法SuccessActivationCodeRepository,并且observeForTesting是扩展函数,您可以看到我在单元测试中添加了更长的延迟,但这无助于它为 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

I.S*_*I.S 9

我添加了 coroutinesTestRule.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)
      }
    }
  }```
Run Code Online (Sandbox Code Playgroud)