项目中没有解析`runBlocking`协程构建器(其他构建器已解决)
Posted
技术标签:
【中文标题】项目中没有解析`runBlocking`协程构建器(其他构建器已解决)【英文标题】:`runBlocking` coroutine builder is not resolved in the project (Other builders are resolved) 【发布时间】:2019-07-23 03:39:00 【问题描述】:正如标题所示,我刚刚在 build.gradle 中添加的协程库中缺少协程构建器 runBlocking
。有趣的是,其他所有东西似乎都可用,GlobalScope
、CoroutineScope.launch
CoroutineScope.async
都在场。 runBlocking
不是。我做错了什么?
这是我的build.gradle
buildscript
ext
ktor_version = "1.1.1"
kotlin_version = "1.3.20-eap-52"
dependencies
classpath "org.jetbrains.kotlin:kotlin-frontend-plugin:0.0.44"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
plugins
id 'kotlin-multiplatform' version '1.3.20-eap-100'
repositories
maven url 'https://dl.bintray.com/kotlin/kotlin-eap'
maven url 'https://dl.bintray.com/kotlin/kotlin-js-wrappers'
maven url 'https://dl.bintray.com/kotlinx/kotlinx'
maven url "https://kotlin.bintray.com/kotlinx"
jcenter()
mavenCentral()
group 'books'
version '0.0.0'
apply plugin: 'maven-publish'
apply plugin: "org.jetbrains.kotlin.frontend"
kotlin
jvm()
compilations.all
tasks[compileKotlinTaskName].kotlinOptions
jvmTarget = "1.8"
js()
compilations.all
tasks[compileKotlinTaskName].kotlinOptions
def optDir = compileKotlinTaskName.contains("Test") ? "test/$project.name.test.js" : "main/$project.name.js"
kotlinOptions.metaInfo = true
kotlinOptions.outputFile = "$project.buildDir.path/js/$optDir"
kotlinOptions.sourceMap = true
kotlinOptions.moduleKind = 'commonjs'
kotlinOptions.main = "call"
sourceSets
commonMain
dependencies
implementation kotlin('stdlib-common')
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$ktor_version"
commonTest
dependsOn commonMain
dependencies
implementation kotlin('test-common')
implementation kotlin('test-annotations-common')
jvmMain
dependencies
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$ktor_version"
implementation kotlin('stdlib-jdk8')
jvmTest
dependsOn jvmMain
dependencies
implementation kotlin('test')
implementation kotlin('test-junit')
jsMain
dependencies
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$ktor_version"
implementation kotlin('stdlib-js')
jsTest
dependsOn jsMain
dependencies
implementation kotlin('test-js')
task runJest(type: Exec)
group = "verification"
commandLine "sh", "runJest.sh"
runJest.dependsOn(jsTest)
task testAll()
group = "verification"
dependsOn(jvmTest, runJest)
kotlinFrontend
npm
devDependency("karma")
sourceMaps = true
webpackBundle
bundleName = "main"
host = "0.0.0.0"
contentPath = file("$buildDir.path/resources/main")
通过 gradle 配置,我已经能够使用 kotlin-multiplatform 很好地编写测试(学习 TDD)。下面是我的示例
import kotlin.test.*
import com.luge.books.*
import kotlinx.coroutines.*
class BookTest
@BeforeTest
fun setup()
val book = Book()
@Test
fun testingInstantiation()
val book = Book()
assertEquals(book.year, 1990, "Books do match the year")
@Test
fun willFail()
assertFalse(false)
@Test
fun testingCoroutines()
val job = GlobalScope.launch
delay(5000)
println("Doing stuff")
assertTrue(false)
如果您仔细观察,测试 testingCoroutines
通过,但由于我是从 GlobalScope
启动的,它只是触发并忘记并且测试返回而没有抛出任何错误。如果我加入runBlocking
,IDE 会用红色突出显示它(你知道,因为它不明白),甚至 kotlin 编译器都会喊,unresolved reference runBlockin
。请帮忙....
【问题讨论】:
您能否提供一个失败代码的示例 如果我将willFail
测试(见上文)中的代码更改为assertFalse(true)
它会失败
很明显,但是这个测试有什么帮助呢?
这是一个样本测试。我做 TDD,需要提醒一下,我的查询是使用协程而不是测试,我没有问题
【参考方案1】:
辗转反侧,终于知道runBlocking只能在kotlin/jvm中使用。所以,它不在 kotlin/js 或 kotlin/common 中。
仅供参考,如果您想运行多平台测试,请使用work around
【讨论】:
从协程 1.6.0 版开始,您可以使用runTest()
方法,它是 runBlocking
的多平台替代品,并进行了一些改进。请参阅thisjetbrains 帖子。以上是关于项目中没有解析`runBlocking`协程构建器(其他构建器已解决)的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程协程启动 ① ( 协程构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )
Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )
Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )
Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。