当前位置: 首页 > news >正文

中国软件网seo公司

中国软件网,seo公司,免备案的网站,北京网站设计推荐刻文章目录 官方文档在测试中调用挂起函数TestDispatchersStandardTestDispatcherUnconfinedTestDispatcher 注入测试调度程序设置主调度程序在测试之外创建调度程序创建您自己的 TestScope注入作用域 官方文档 https://developer.android.google.cn/kotlin/coroutines/test?hl…

文章目录

    • 官方文档
    • 在测试中调用挂起函数
    • TestDispatchers
      • StandardTestDispatcher
      • UnconfinedTestDispatcher
    • 注入测试调度程序
    • 设置主调度程序
    • 在测试之外创建调度程序
    • 创建您自己的 TestScope
    • 注入作用域

官方文档

https://developer.android.google.cn/kotlin/coroutines/test?hl=zh-cn
API 是 kotlinx.coroutines.test 库的一部分。如需访问这些 API,请务必添加相应工件作为项目的测试依赖项。

dependencies {testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
}

在测试中调用挂起函数

如需在测试中调用挂起函数,您必须位于协程中。由于 JUnit 测试函数本身并不是挂起函数,因此您需要在测试中调用协程构建器以启动新的协程。

suspend fun fetchData(): String {delay(1000L)return "Hello world"
}@Test
fun dataShouldBeHelloWorld() = runTest {val data = fetchData()assertEquals("Hello world", data)
}

TestDispatchers

TestDispatchers 是用于测试的 CoroutineDispatcher 实现。如果要在测试期间创建新的协程,您需要使用 TestDispatchers,以使新协程的执行可预测。

注意:新协程可直接在测试主体中创建,也可在测试中所调用的任何代码中创建(例如在测试的对象中)。
TestDispatcher 有两种可用的实现:StandardTestDispatcher 和 UnconfinedTestDispatcher,可分别对新启动的协程执行不同的调度。两者都使用 TestCoroutineScheduler 来控制虚拟时间并管理测试中正在运行的协程。

一个测试中只能使用一个调度器实例,且所有 TestDispatchers 应共用该调度器。如需了解如何共用调度器,请参阅注入测试调度程序。

为了启动顶级测试协程,runTest 会创建一个 TestScope,它是 CoroutineScope 的实现,将始终使用 TestDispatcher。如果未指定,TestScope 将默认创建 StandardTestDispatcher,并将其用于运行顶级测试协程。

StandardTestDispatcher

@Test
fun standardTest() = runTest {val userRepo = UserRepository()launch { userRepo.register("Alice") }launch { userRepo.register("Bob") }assertEquals(listOf("Alice", "Bob"), userRepo.getAllUsers()) // ❌ Fails
}

可通过多种方式让出测试协程,以让排队的协程运行。所有以下调用都可在返回之前让其他协程在测试线程上运行:

advanceUntilIdle:在调度器上运行所有其他协程,直到队列中没有任何内容。这是一个不错的默认选择,可让所有待处理的协程运行,适用于大多数测试场景。
advanceTimeBy:将虚拟时间提前指定时长,并运行已调度为在该虚拟时间点之前运行的所有协程。
runCurrent:运行已调度为在当前虚拟时间运行的协程。

UnconfinedTestDispatcher

如果在 UnconfinedTestDispatcher 上启动新协程,系统会在当前线程上快速启动。也就是说,这些协程会立即开始运行,而不会等待其协程构建器返回。在许多情况下,这种调度行为会使测试代码更加简单,因为您无需手动让出测试线程即可让新协程运行。

@Test
fun unconfinedTest() = runTest(UnconfinedTestDispatcher()) {val userRepo = UserRepository()launch { userRepo.register("Alice") }launch { userRepo.register("Bob") }assertEquals(listOf("Alice", "Bob"), userRepo.getAllUsers()) // ✅ Passes
}

注入测试调度程序

设置主调度程序

在本地单元测试中,封装 Android 界面线程的 Main 调度程序将无法使用,因为这些测试是在本地 JVM 而不是 Android 设备上执行的。如果被测试代码引用主线程,它会在单元测试期间抛出异常。

在测试之外创建调度程序

class Repository(private val ioDispatcher: CoroutineDispatcher) { /* ... */ }class RepositoryTestWithRule {private val repository = Repository(/* What TestDispatcher? */)@get:Ruleval mainDispatcherRule = MainDispatcherRule()@Testfun someRepositoryTest() = runTest {// Test the repository...// ...}
}

创建您自己的 TestScope

class SimpleExampleTest {val testScope = TestScope() // Creates a StandardTestDispatcher@Testfun someTest() = testScope.runTest {// ...}
}

注入作用域

如果有类创建需要您在测试期间控制的协程,则可以将协程作用域注入到该类中,并在测试中将其替换为 TestScope

class UserState(private val userRepository: UserRepository,private val scope: CoroutineScope,
) {private val _users = MutableStateFlow(emptyList<String>())val users: StateFlow<List<String>> = _users.asStateFlow()fun registerUser(name: String) {scope.launch {userRepository.register(name)_users.update { userRepository.getAllUsers() }}}
}
class UserStateTest {@Testfun addUserTest() = runTest { // this: TestScopeval repository = FakeUserRepository()val userState = UserState(repository, scope = this)userState.registerUser("Mona")advanceUntilIdle() // Let the coroutine complete and changes propagateassertEquals(listOf("Mona"), userState.users.value)}
}
http://www.wangmingla.cn/news/147887.html

相关文章:

  • 南昌专门做网站的人汕头seo排名收费
  • 上海做兼职哪个网站靠谱吗优化网站排名工具
  • 教学类网站怎么做网站发布流程
  • 怎么做属于自己的网站微信群推广平台有哪些
  • 麓谷网站建设郑州网络营销哪个好
  • html公益网站模板网站关键词优化排名外包
  • 手机能制作网站吗seo工作
  • 中山网站搜索排名seo网络推广知识
  • 2022石家庄疫情时间线宜昌网站seo收费
  • 雄县没有做网站的公司it培训机构出来能找到工作吗
  • 网优 是什么网站成都网站推广公司
  • 装修公司加盟哪个平台江苏泰州seo网络优化推广
  • 中国网站建设第一品牌湖南网站营销seo多少费用
  • 广州高端品牌网站建设新手怎么做销售
  • 站中站网站案例品牌营销的概念
  • 哪个网站可以做代销营销型网站设计制作
  • 宁波手机网站制作搜索引擎优化是什么意思
  • 临沂企业建站模板郑州网站托管
  • 山东城建设计院网站舟山百度seo
  • css购物网站选中商品样式怎么做google学术搜索
  • 镇江市建设审图网站一键优化免费下载
  • 用自己网站做邮箱域名解析网络视频营销的案例
  • 工程公司招聘西安网络seo公司
  • 太仓网站建设网站推广产品免费推广网站有哪些
  • 求大佬给个资源找累了深圳seo优化公司
  • 昆山网站开发百度搜索引擎seo
  • 任县网站建设服务价格北京网站建设东轩seo
  • ip网站怎么做营销型网站制作
  • 重庆sem网站推广百度在线人工客服
  • 如何在网站上做用工登记百度搜索下载