如何对在协程中延迟调用的方法进行单元测试

时间:2021-07-06 09:08:20

标签: android unit-testing kotlin-coroutines

前段时间我问了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()
  }
}

0 个答案:

没有答案
相关问题