Unit testing 协同程序测试失败,出现“0”;这项工作尚未完成;
我正在关注Craig Russell关于测试协同程序的博文:但我无法通过此测试:Unit testing 协同程序测试失败,出现“0”;这项工作尚未完成;,unit-testing,kotlin,kotlin-coroutines,Unit Testing,Kotlin,Kotlin Coroutines,我正在关注Craig Russell关于测试协同程序的博文:但我无法通过此测试: @Test fun multipleLaunch() = runBlockingTest { var result = 0 val jobs = mutableListOf<Job>() for (j in 0 until 10) { val job = launch(testDispatcherProvider.io()) { delay
@Test
fun multipleLaunch() = runBlockingTest {
var result = 0
val jobs = mutableListOf<Job>()
for (j in 0 until 10) {
val job = launch(testDispatcherProvider.io()) {
delay(1000)
result++
}
jobs.add(job)
}
jobs.forEach { job ->
job.join()
}
assertEquals(10, result)
}
@测试
fun multipleLanch()=运行BlockingTest{
var结果=0
val jobs=mutableListOf()
对于(0到10之间的j){
val job=launch(testDispatcherProvider.io()){
延迟(1000)
结果++
}
jobs.add(作业)
}
jobs.forEach{job->
job.join()
}
资产质量(10,结果)
}
基本上,我正在启动一系列并行作业,并希望在所有作业完成后获得结果。
我现在得到了这个,经典的例外:
java.lang.IllegalStateException:此作业尚未完成
请告知如何使其按预期工作
我的完整代码:
class LaunchTest {
@get:Rule
var coroutinesTestRule = CoroutineTestRule()
val testDispatcherProvider = object : DispatcherProvider {
override fun io(): CoroutineDispatcher = coroutinesTestRule.testDispatcher
}
@Test
fun multipleLaunch() = runBlockingTest {
var result = 0
val jobs = mutableListOf<Job>()
for (j in 0 until 10) {
val job = launch(testDispatcherProvider.io()) {
delay(1000)
result++
}
jobs.add(job)
}
jobs.forEach { job ->
job.join()
}
assertEquals(10, result)
}
}
class CoroutineTestRule constructor(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()
}
}
类启动测试{
@获取:规则
var coroutinestrule=coroutinestrule()
val testDispatcherProvider=对象:DispatcherProvider{
override fun io():CoroutineDispatcher=coroutinestrule.testDispatcher
}
@试验
fun multipleLanch()=运行BlockingTest{
var结果=0
val jobs=mutableListOf()
对于(0到10之间的j){
val job=launch(testDispatcherProvider.io()){
延迟(1000)
结果++
}
jobs.add(作业)
}
jobs.forEach{job->
job.join()
}
资产质量(10,结果)
}
}
类coroutinestrule构造函数(val testDispatcher:TestCoroutineDispatcher=TestCoroutineDispatcher()):TestWatcher(){
覆盖乐趣启动(说明:说明?){
超级启动(说明)
Dispatchers.setMain(testDispatcher)
}
覆盖乐趣已完成(说明:说明?){
超级。完成(说明)
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()文件
}
}
已解决
我完全归咎于Android Studio的自动完成
我只是运行了错误的“runBlockingTest()”
替换此行:
fun multipleLaunch() = runBlockingTest {
fun multipleLaunch() = coroutinesTestRule.testDispatcher.runBlockingTest {
这一行:
fun multipleLaunch() = runBlockingTest {
fun multipleLaunch() = coroutinesTestRule.testDispatcher.runBlockingTest {
我使用了
runBlockingTest{}
而不是runBlockingTest{}
,因为它已经很老了,一些人建议使用runBlockingTest{/code>而不是runBlockingTest
。谢谢。我见过这个问题。但我怀疑我的代码中还有其他错误,因为我确实在注入一个测试调度器,而不是Dispatchers.IO。这样,您将失去此处提到的运行blockingtest的一些功能。很好@Hassan