【问题标题】:Gradle JUnit Espresso on Emulator connectedAndroidTest java.lang.IncompatibleClassChangeErrorGradle JUnit Espresso on Emulator connectedAndroidTest java.lang.IncompatibleClassChangeError
【发布时间】:2014-12-29 19:50:38
【问题描述】:

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

Gradle 2.2.1 模拟器安卓5.0

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

  1. android create avd --force -n test -t "android-21"
  2. 模拟器 -avd 测试 -no-skin -no-audio -no-window &
  3. adb 等待设备
  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')
    }
}

错误日志是

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.

什么会产生这个错误?

【问题讨论】:

  • 你能从 logcat 发布完整的 IncompatibleClassChangeError 堆栈跟踪吗?此外,众所周知,Espresso 1.1 在 API 21 设备上存在问题(尽管我认为这不是问题所在)
  • 你可能是对的!我将 Espresso 更新到 2.0,然后错误消失了。
  • 如何知道我们应该添加哪些库作为依赖项以及排除哪些组/模块?
  • 如果这是一个普遍的问题,那完全取决于您的项目需要什么和不需要什么。在我的 espresso 和 dagger 的具体示例中,我想在没有任何依赖注入(dagger)的情况下进行简单的 espresso 测试,所以我添加了 espresso 但排除了 dagger。

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


【解决方案1】:

简短回应:

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

模拟器在等待设备后没有完全启动,它还没有为你的测试做好准备,你的应用由于超时而没有安装,所以没有执行测试并且构建失败,因为添加了一个新的行为来提醒你它。

您可以将adb wait-for-device 替换为等待stopped 状态(完全启动)检查adb -e shell getprop init.svc.bootanim 的循环,就像公共域中的this script 一样。 Further 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(加速但与等待模拟器脚本不兼容)或使用adb wait-for-device && sleep 300(以确保模拟器完全启动)。

关于浓缩咖啡:

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

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

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

还有谷歌published new samples:

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

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

关于 Gradle 任务:

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

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

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

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

所以我认为:

  • 现在是迁移到 Espresso 2.0 的好时机(并避免 dependencies? 问题)。
  • 你需要等待模拟器停止状态,我推荐this link理解它。
  • 您不需要特定的install* 任务,可以将assemble 替换为build(包括lint)并使用connectedCheck(包括connectedAndroidTest)。
  • 如果安装了多个 ABI,您需要选择一个(并回答否):- echo no | android create avd -f -n test -t $ANDROID_TARGET -b $ANDROID_ABI
  • 我会在您选择的 CI 服务器上试用他们的示例,作为实现目标的第二步。

【讨论】:

  • 感谢您提供的重要信息。我正在一块一块地尝试。将更新结果。
  • 我更新了 Espresso 并且构建成功。但是我也想查看 adb 命令。
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2014-07-20
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2021-11-05
相关资源
最近更新 更多