android.os.Looper 中的方法 myLooper 未使用协程模拟
Method myLooper in android.os.Looper not mocked with Coroutines
我想在 JUnit 中做一些协程测试,但我遇到了一些问题。代码很简单:
@Test
fun coroutineTest() {
//runBlocking(Unconfined) doesnt work too
runBlocking () {
delay(1000)
println("test")
}
}
但是我遇到了那个错误
java.lang.RuntimeException: Method myLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.os.Looper.myLooper(Looper.java)
at kotlinx.coroutines.experimental.android.MainLooperChecker.checkRunBlocking(HandlerContext.kt:124)
at kotlinx.coroutines.experimental.BuildersKt__BuildersKt.runBlocking(Builders.kt:42)
at kotlinx.coroutines.experimental.BuildersKt.runBlocking(Unknown Source)
at app.deadmc.sometests.tests.ExampleUnitTest.coroutineTest(ExampleUnitTest.kt:22)
我首先想到的是协程上下文错误。所以为了确保我使用了 Unconfined
但这不起作用。
我试过了
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
但这也不起作用,我收到以下错误:
java.lang.IllegalStateException: runBlocking is not allowed in Android main looper thread
但是根本没有Android main looper
!
如何 运行 在 JUnit 中阻塞协程?
感谢 Marko Topolnik 的想法。
问题出在 0.24.0 version of coroutines 因为:
Attempts to use runBlocking from any supported UI thread (Android,
JavaFx, Swing) will result in exception.
不幸的是,该版本在 JUnit
测试中存在错误,因此它也不允许在 JUnit 中使用 runBlocking
。
解决方案是将协同程序的版本更改为 0.23.4
您可以通过环境变量删除此检查。
要么在你的测试初始化中设置它:
System.setProperty("kotlinx.coroutines.blocking.checker", "disable")
要么通过 Gradle 设置 env 变量:
-Dkotlinx.coroutines.blocking.checker=disable
我想在 JUnit 中做一些协程测试,但我遇到了一些问题。代码很简单:
@Test
fun coroutineTest() {
//runBlocking(Unconfined) doesnt work too
runBlocking () {
delay(1000)
println("test")
}
}
但是我遇到了那个错误
java.lang.RuntimeException: Method myLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.os.Looper.myLooper(Looper.java)
at kotlinx.coroutines.experimental.android.MainLooperChecker.checkRunBlocking(HandlerContext.kt:124)
at kotlinx.coroutines.experimental.BuildersKt__BuildersKt.runBlocking(Builders.kt:42)
at kotlinx.coroutines.experimental.BuildersKt.runBlocking(Unknown Source)
at app.deadmc.sometests.tests.ExampleUnitTest.coroutineTest(ExampleUnitTest.kt:22)
我首先想到的是协程上下文错误。所以为了确保我使用了 Unconfined
但这不起作用。
我试过了
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
但这也不起作用,我收到以下错误:
java.lang.IllegalStateException: runBlocking is not allowed in Android main looper thread
但是根本没有Android main looper
!
如何 运行 在 JUnit 中阻塞协程?
感谢 Marko Topolnik 的想法。
问题出在 0.24.0 version of coroutines 因为:
Attempts to use runBlocking from any supported UI thread (Android, JavaFx, Swing) will result in exception.
不幸的是,该版本在 JUnit
测试中存在错误,因此它也不允许在 JUnit 中使用 runBlocking
。
解决方案是将协同程序的版本更改为 0.23.4
您可以通过环境变量删除此检查。
要么在你的测试初始化中设置它:
System.setProperty("kotlinx.coroutines.blocking.checker", "disable")
要么通过 Gradle 设置 env 变量:
-Dkotlinx.coroutines.blocking.checker=disable