android.os.Looper中的方法myLooper不与协程一起模拟

时间:2018-07-28 19:19:10

标签: android junit kotlin kotlinx.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中阻止协程?

2 个答案:

答案 0 :(得分:8)

感谢Marko Topolnik的想法。

0.24.0 version of coroutines的问题在于:

  

尝试从任何受支持的UI线程(Android,   JavaFx,Swing)将导致异常。

不幸的是,发行版在JUnit测试中存在一个错误,因此不允许在JUnit中也使用runBlocking

解决方案正在将协程的版本更改为0.23.4

答案 1 :(得分:0)

您可以通过环境变量删除此检查。

在测试初始化​​中进行设置:

library(gstat)
library(sp)

lat <-  c(-23.49174, -23.49179, -23.49182, -23.49183, -23.49185, -23.49187)
long <- c(152.0718, 152.0718, 152.0717, 152.0717, 152.0717, 152.0717)
pH <- c(8.222411, 8.19931, 8.140428, 8.100752, 8.068141, 8.048852)
sample <- data.frame(lat, long, pH)

x.range <- range(sample$long)
y.range <- range(sample$lat)

x<-seq(x.range[1], x.range[2], length.out=20)
y<-seq(y.range[1], y.range[2], length.out=20)
grd<-expand.grid(x,y)

coordinates(sample) = ~long+lat
coordinates(grd) <- ~ Var1+Var2
gridded(grd) <- TRUE

proj4string(sample) <- CRS("+proj=longlat +datum=WGS84")
proj4string(grd) <- CRS("+proj=longlat +datum=WGS84")

dat.idw <- idw(formula=pH ~ 1, locations = sample, newdata = grd, idp = 2.0)
#> [inverse distance weighted interpolation]

通过Gradle使用以下方法设置env变量:

System.setProperty("kotlinx.coroutines.blocking.checker", "disable")