使用协程延迟验证在单元测试中调用的方法
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
就等待协程的执行。
我一直在阅读 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
就等待协程的执行。