使用协程延迟验证在单元测试中调用的方法

Verify method called in unit testing using coroutine with delay

我一直在阅读 this article 以了解如何对包含延迟的协程进行单元测试并应用它,但我仍然不明白为什么 verify 在调用之前被调用myDelayedMethod() 在协程中,因此验证失败。有没有办法在测试中同步执行代码?

伪代码:

class ClasUnderTest{

  fun method1(){
      GlobalScope.launch {
      myDelayedMethod()
    }
  }

  suspend fun myDelayedMethod(): String{
    withContext(dispatchers.default()){
      delay(X)
      ...
      someClass.someMethod()
   }
  }
}

@Test
fun myTest()= coroutinesTestRule.testDispatcher.runBlockingTest {
  val someClassMock = mock(SomeClass::class.java)
  val myObject = ClasUnderTest(someClassMock) 
  method1()
  verify(someClassMock).someMethod()
}

一个想法可以是 return method1 中的 Job,如下所示:

fun method1(): Job {
  return GlobalScope.launch {
    myDelayedMethod()
  }
}

然后将method1()替换为method1().join(),这样runBlockingTest就等待协程的执行。