gpt4 book ai didi

android - MainCoroutineRule 和 runBlocking 的区别

转载 作者:行者123 更新时间:2023-12-05 00:18:24 28 4
gpt4 key购买 nike

MainCoroutineRulerunBlocking Kotlin Coroutines 都是为测试目的而设计的。似乎两者都提供相同的功能:在测试环境中同步运行代码。
那么有什么区别呢?他们每个人的最佳用例是什么?

最佳答案

MainCoroutineRulerunBlocking看似相似,但有明显的区别。
MainCoroutineRule的辩护:

MainCoroutineRule installs a TestCoroutineDispatcher for Disptachers.Main. Since it extends TestCoroutineScope, you can directly launch coroutines on the MainCoroutineRule as a [CoroutineScope]...


runBlocking的辩护:

Runs a new coroutine and blocks the current thread interruptibly until its completion. This function should not be used from a coroutine. It is designed to bridge regular blocking code to libraries that are written in suspending style, to be used in main functions and in tests. ...


在定义上, runBlocking仅用于协程中的同步执行。它不仅用于测试,还用于 UI 管理、数据管理和 Android 开发中的其他几个领域。
鉴于 runBlocking更普遍地使用, MainCoroutineRule仅在测试中使用,它具有与 runBlocking 中相同的同步执行行为。 .但是, MainCoroutineRule具有 runBlocking 中没有的更专业的测试功能比如控制流管理。此外,使用 MainCoroutineRule将显着使您的测试代码更清洁。
更详细地说,MainCoroutineRule 与 JUnit Rule 直接相关。如果您以前使用过 JUnit,您可能还记得填写 @Before @After为测试用例提供测试环境。如果您有多个测试用例,您最终将不得不编写多个 @Before @After提供多个测试环境,这可能会导致冗余的样板代码。现在,这就是 MainCoroutineRule闪耀!与 MainCoroutineRule您可以声明一次测试环境,然后将它们重用于多个测试用例。
比较以下两个示例代码:
不使用 MainCoroutineRule 的测试用例
  @ExperimentalCoroutinesApi
class MyViewModelTest {
private val testDispatcher = TestCoroutineDispatcher()

@Before
fun setup() {
Dispatchers.setMain(testDispatcher)
}

@After
fun tearDown() {

Dispatchers.resetMain()

testDispatcher.cleanupTestCoroutines()
}

@Test
fun testSomething() = runBlockingTest {
...
}
}
使用 MainCoroutineRule 的测试用例
@ExperimentalCoroutinesApi
class MainCoroutineRule(
val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
) : TestWatcher() {

override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(testDispatcher)
}

override fun finished(description: Description?) {
super.finished(description)
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
}

@ExperimentalCoroutinesApi
fun MainCoroutineRule.runBlockingTest(block: suspend () -> Unit) =
this.testDispatcher.runBlockingTest {
block()
}
有多方便?这说明谷歌其实很关心开发者。
如果您有任何问题,请告诉我。

关于android - MainCoroutineRule 和 runBlocking 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67969753/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com