Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 协同程序测试失败,出现“0”;这项工作尚未完成;_Unit Testing_Kotlin_Kotlin Coroutines - Fatal编程技术网

Unit testing 协同程序测试失败,出现“0”;这项工作尚未完成;

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

我正在关注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(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