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

时间:2014-12-29 19:50:39

标签: android junit gradle android-emulator android-espresso

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

Gradle 2.2.1 仿真器Android 5.0

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

  1. android create avd --force -n test -t" android-21"
  2. emulator -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
  7. 的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')
        }
    }
    

    错误日志

    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.
    

    什么可能产生此错误?

1 个答案:

答案 0 :(得分:9)

简要回复:

This似乎是关于java.lang.IncompatibleClassChangeError的良好链接。如果你在CI上试一试:

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

您可以将adb wait-for-device替换为等待stopped状态(完全启动)的循环,将adb -e shell getprop init.svc.bootanim检查为公共域中的this scriptFurther info here

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

关于CI,未找到任何测试:

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

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

如果您首先在本地运行它,请在没有-no-window的情况下尝试(因此您看到它)或添加-no-boot-anim(加速它但与wait-for-emulator脚本不兼容)或使用{ {1}}(确保模拟器完全启动)。

关于Espresso:

Double Espresso is deprecated因为Espresso 2.0 is now available。 Double Espresso是Espresso 1.1的纯Gradle端口,Jake Wharton在两周前发布2.0版时弃用它。

他们updated the wikiJavaDoc (they will move it to android.com)

You can now use the Android Support Repository to download the latest version.

Google published new samples:

  

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

     

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

关于Gradle任务:

来自Android tasksRunning tests(Gradle插件用户指南):

  • adb wait-for-device && sleep 300组装项目输出的任务
  • assemble运行需要连接设备或模拟器的检查。

使用名为connectedCheck的锚点任务启动需要连接设备的检查。这取决于任务androidTest,因此将运行它。此任务执行以下操作:

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

所以我认为:

  • 这是迁移到Espresso 2.0的好时机(避免dependencies?问题)。
  • 您需要等待模拟器停止状态,我建议您this link了解它。
  • 您不需要具体的connectedCheck任务,可以install*替换assemble(包括build)并使用lint(包括connectedCheck })。
  • 如果安装了多个ABI,您需要选择一个(并回答否):connectedAndroidTest
  • 我会根据您的目标在您选择的CI服务器上尝试他们的示例。