【问题标题】:Why are my unit tests targeting the wrong version of Android?为什么我的单元测试针对的是错误的 Android 版本?
【发布时间】:2013-12-10 22:57:21
【问题描述】:

我正在尝试验证与 WebView 控件交互的代码是否正确地将 Javascript 调用传递到 WebView,但我的单元测试没有正确执行。看起来测试可能是针对错误的 Android 版本运行的。

我的测试:

@Test
public void testJavascript() {
  // myObj will pass its argument as a string to a WebView control referenced in the
  // test as mWebView
  myObj.callJavascript("some code"); // passes to a WebView control

  // Using Mockito to verify calls to mocked WebView
  verify(mWebView).evaluateJavascript(anyString(), any(ValueCallback.class));
}

我的构建目标是 Android 4.4,我的构建系统使用 Gradle。我是 Gradle 的新手,可能会搞砸一些事情。据我所知,Maven Central 没有安装 Android 4.4,所以我使用的是 Android Studio 安装中的本地 .jar 文件。

来自 build.gradle:

android {
  compileSdkVersion 19
  defaultConfig {
    minSdkVersion 9
    targetSdkVersion 19
  }
}

sourceSets {
  unitTest {
    java.srcDir file('src/test/java')
    resources.srcDir file('src/test/res')
  }
}

configurations {
  unitTestCompile.extendsFrom runTime
  unitTestRuntime.extendsFrom unitTestCompile
}

dependencies {
  unitTestCompile files("$project.buildDir/classes/release")
  unitTestCompile 'junit:junit:4.11'
  unitTestCompile 'org.robolectric:robolectric:2.2'
  unitTestCompile 'org.mockito:mockito-core:1.9.5'
  unitTestCompile files('../libs/android-19.jar') // From Android Studio
}

task unitTest(type:Test, dependsOn:assemble) {
  testClassesDir = project.sourceSets.unitTest.output.classesDir
  classpath = project.sourceSets.unitTest.runtimeClasspath
}
check.dependsOn unitTest

tasks.withType(Test) {
  scanForTestClasses = false
  include "**/*Tests.class"
}

当我尝试通过 gradle unitTest 运行测试时,我收到一个我无法理解的错误:

com.example.Tests > testCallJavascript FAILED
java.lang.NoSuchMethodError: android.webkit.WebView.evaluateJavascript(Ljava/lang/String;Landroid/webkit/ValueCallback;)V
    at com.exampleTests.testCallJavascript(Tests.java:...)

更新:

好的,在添加调试 println 以检查运行测试所针对的 SDK 版本之后,看起来它们正在针对不支持 WebView.evaluateJavascript() 的 APILEVEL 14 运行。据我所知,我从未将此项目配置为以 APILEVEL 14 为目标。我应该在哪里寻找配置错误的想法?谢谢!

【问题讨论】:

    标签: android gradle mockito robolectric android-4.4-kitkat


    【解决方案1】:

    Robolectric 尚不支持 API-19。如果使用了无效的 API 目标,Robolectric 默认使用 API-14。

    见:https://groups.google.com/forum/#!msg/robolectric/LBOgSkD5O9U/qooiA_xDv_4J

    【讨论】:

      【解决方案2】:

      Robolectric 仅支持一个版本的 Android AFAIK,因为它必须伪造很多 Android 东西。

      因此,如果您在 robolectric 中运行测试,您就会被它所模拟的版本所困扰。要控制环境,请在您选择的模拟器中运行测试。

      【讨论】:

      • 从 Robolectric 的人那里我了解到,如果它发现 Android 版本太高而无法处理,它会退回到 API 级别 14。他们说他们应该有一个可以在接下来的几周内使用 Android 4.4 的版本。
      【解决方案3】:

      根据Gradle Android plugin docs,在构建中编译/运行的API级别配置如下:

      android {
          compileSdkVersion 17
      }
      

      【讨论】:

      • 我已经更新了我的问题以显示(相关部分?)来自我的 build.gradle 的 android 配置部分。我的目标是 API 级别 19,并且测试正在针对 API 级别 19 正确构建。不过,它们是针对 API 级别 14 运行的,这就是我想要弄清楚的。
      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2010-09-25
      • 1970-01-01
      • 2018-02-14
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多