- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
MainCoroutineRule
和 runBlocking
Kotlin Coroutines 都是为测试目的而设计的。似乎两者都提供相同的功能:在测试环境中同步运行代码。
那么有什么区别呢?他们每个人的最佳用例是什么?
最佳答案
MainCoroutineRule
和 runBlocking
看似相似,但有明显的区别。
MainCoroutineRule的辩护:
MainCoroutineRule installs a TestCoroutineDispatcher for Disptachers.Main. Since it extends TestCoroutineScope, you can directly launch coroutines on the MainCoroutineRule as a [CoroutineScope]...
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
将显着使您的测试代码更清洁。
@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/
MainCoroutineRule和 runBlocking Kotlin Coroutines 都是为测试目的而设计的。似乎两者都提供相同的功能:在测试环境中同步运行代码。 那么有什么区别呢?他们每
我是一名优秀的程序员,十分优秀!