模拟器上的Gradle JUnit Espresso connectedAndroidTest java.lang.IncompatibleClassChangeError

Emm*_*mma 3 junit android gradle android-emulator android-espresso

我有一个简单的单元测试静态方法并在模拟器上运行它们.(目标是在云CI上运行,因此我在模拟器上进行测试.)

Gradle 2.2.1仿真器Android 5.0

我在控制台上使用这些步骤.

  1. android create avd --force -n test -t"android-21"
  2. 模拟器-avd test -no-skin -no-audio -no-window&
  3. adb wait-for-device
  4. adb shell输入keyevent 82&
  5. gradle clean installDebug
  6. gradle connectedAndroidTest

的build.gradle

dependencies {
    ...

    androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') {
        exclude group: 'com.squareup.dagger'
        exclude group: 'com.squareup.dagger:dagger:1.2.1'
    }
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 21

        testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    }

    sourceSets {
        androidTest.setRoot('src/androidTest')
    }
}
Run Code Online (Sandbox Code Playgroud)

错误日志是

Tests on test(AVD) - 5.0 failed: Instrumentation run failed due to 'java.lang.IncompatibleClassChangeError'

com.android.builder.testing.ConnectedDevice > hasTests[test(AVD) - 5.0] FAILED
No tests found.
Run Code Online (Sandbox Code Playgroud)

什么会产生这个错误?

alb*_*elu 9

简要回复:

似乎是一个很好的联系java.lang.IncompatibleClassChangeError.如果你在CI上尝试:

在等待设备之后,仿真器没有完全启动,它没有为您的测试做好准备,并且由于超时而未安装您的应用程序,因此没有执行测试,并且构建失败,因为添加了新行为以提醒您.

您可以adb wait-for-device通过等待stopped状态(完全启动)检查的循环替换,adb -e shell getprop init.svc.bootanim因为公共域中的此脚本会执行操作.更多信息在这里.

可能的CI问题,Double Espresso已弃用且Espresso 2.0已发布:

关于CI,没有发现任何测试:

在这里回答了另一个问题,但具体针对Travis-ci.类似的错误,但由于使用的脚本被窃听.如果您运行,gradle installDebug --debug您将了解有关错误的更多信息(在此处共享日志).

但是在CI服务器上运行相同的步骤,如果我是对的,你会看到由ShellCommandUnresponsiveException引起的InstallException两分钟INSTALL_TIMEOUT.您可以使用环境变量ADB_INSTALL_TIMEOUT=6#minutes 来增加此值,但这不是您现在的问题.

如果您首先在本地运行它,请尝试不要-no-window(所以你看到它)或添加-no-boot-anim(加速它但与wait-for-emulator脚本不兼容)或使用adb wait-for-device && sleep 300(以确保模拟器完全启动).

关于Espresso:

Double Espresso已弃用,因为Espresso 2.0现已推出.Double Espresso是Espresso 1.1的纯Gradle端口,Jake Wharton在两周前发布2.0版时弃用了它.

他们更新了wikiJavaDoc(他们将其移至android.com).

您现在可以使用Android支持存储库下载最新版本.

谷歌发布了新样本:

示例先决条件:Android SDK v21,Android Build Tools v21.1.2,Android支持存储库.

这些示例使用Gradle构建系统.要构建项目,请输入项目目录并使用./gradlew汇编命令或使用Android Studio中的"导入项目".使用./gradlew connectedCheck在连接的仿真器或设备上运行测试.

关于Gradle任务:

Android任务运行测试(Gradle插件用户指南):

  • assemble 组装项目输出的任务
  • connectedCheck 运行需要连接设备或仿真器的检查.

需要连接设备的检查是在调用锚点任务的情况下启动的connectedCheck.这取决于任务androidTest,因此将运行它.此任务执行以下操作:

  • 确保构建应用程序和测试应用程序(取决于assembleDebug和assembleTest)
  • 安装两个应用
  • 运行测试
  • 卸载这两个应用.

所以我认为:

  • 这是迁移到Espresso 2.0(并避免依赖性?问题)的好时机.
  • 你需要等待模拟器停止状态,我建议这个链接来理解它.
  • 您不需要特定install*任务,可以替换assemblebuild(包括lint)和使用connectedCheck(包括connectedAndroidTest).
  • 如果安装了多个ABI,您需要选择一个(并回答否): - echo no | android create avd -f -n test -t $ANDROID_TARGET -b $ANDROID_ABI
  • 我会在您选择的CI服务器上尝试他们的样本,作为遵循目标的第二步.