问题描述
我一直在阅读这篇文章 了解如何对包含延迟的协程进行单元测试并应用它,但我仍然不明白为什么在协程中调用 myDelayedMethod() 之前调用了 verify
,因此验证失败.有没有办法在测试中同步执行代码?
I've been reading this article to understand how to unit test a coroutine that contains a delay and applied it, but I still don't understand why verify
is being called before having called myDelayedMethod() in the coroutine and therefore the verification fails. Isn't there a way to execute the code synchronously in the test?
伪代码:
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()
}
推荐答案
一个想法可能是返回 method1
中的 Job
,如下所示:
One idea could be to return the Job
in method1
like the following:
fun method1(): Job {
return GlobalScope.launch {
myDelayedMethod()
}
}
然后将method1()
替换为method1().join()
,让runBlockingTest
等待协程的执行.
And then replace method1()
with method1().join()
, so that runBlockingTest
waits for the execution of the coroutine.
这篇关于使用带有延迟的协程验证在单元测试中调用的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!