前段时间我问了this question如何处理有延迟的协程,当时的解决方案对我有帮助,但我想知道是否有更好的方法来管理这种情况而不是获得一份工作并调用加入它。
这是我的代码的样子:
class SomeClass(private val dispatchers: DispatcherProvider,private val externalScope: CoroutineScope){
override fun someMethod1( ) {
somePrivateMethod()
}
private fun somePrivateMethod() {
externalScope.launch(dispatchers.io()) {
delay(SOME_TIME)
listener.someCallback()
}
}
}
我的测试类看起来像这样:
@ExperimentalCoroutinesApi
class CoroutineTestRule(val testCoroutineScope: TestCoroutineScope, val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()) :
TestWatcher() {
val testDispatcherProvider = object : DispatcherProvider {
override fun default(): CoroutineDispatcher = testDispatcher
override fun io(): CoroutineDispatcher = testDispatcher
override fun main(): CoroutineDispatcher = testDispatcher
override fun unconfined(): CoroutineDispatcher = testDispatcher
}
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(testDispatcher)
}
override fun finished(description: Description?) {
super.finished(description)
Dispatchers.resetMain()
testCoroutineScope.cleanupTestCoroutines()
}
}
@RunWith(MockitoJUnitRunner::class)
class MyTestClass {
@ExperimentalCoroutinesApi
var testCoroutineScope = TestCoroutineScope()
@ExperimentalCoroutinesApi
@get:Rule
var coroutinesTestRule = CoroutineTestRule(testCoroutineScope)
@Test
fun `some test`() = coroutinesTestRule.testDispatcher.runBlockingTest {
val myListener = myListener()
val myObject = SomeClass(myListener)
myObject.someMethod1()
verify(listener).someCallback()
}
}