【问题标题】:upgrading android gradle plugin from 1.2.3 -> 1.5.0 = unit tests broken从 1.2.3 升级 android gradle 插件 -> 1.5.0 = 单元测试损坏
【发布时间】:2015-12-09 01:37:49
【问题描述】:

目前,我的android项目使用的是gradle插件版本1.2.3。我能够使用 gradle 命令“./gradlew clean connectedProductionAndroidTest”成功运行单元测试(android 测试),其中“Production”是一种风格。

但是,当我将 gradle 插件更新到 1.5.0 时,出现以下错误。

17:35:16 Tests on Android SDK built for x86 - 4.2 failed: Instrumentation run failed due to 'java.lang.IllegalAccessError'
17:35:16 
17:35:16 com.android.builder.testing.ConnectedDevice > No tests found.[Android SDK built for x86 - 4.2] [31mFAILED [0m
17:35:16 No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).

当我更新 gradle 插件时,我没有对目录结构和我的任何测试进行任何更改。

这是我用来更新 gradle 插件的代码。这是在我的 root build.gradle 文件中。

buildscript {
    repositories { 
        jcenter()
    }


    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}

我只是想知道这两个版本之间是否有任何变化可能导致我的测试失败?

请注意,我已按照文档中的说明将测试放在“$ROOT/app/src/androidTest/java/...”中。此外,在 gradle 1.2.3 中,我不得不使用命令“./gradlew clean connectedProductionAndroidTest”,但在插件版本 1.5.0 中,情况似乎发生了变化。我现在必须做:“./gradlew clean connectedAndroidTestProduction”。注意“Production”和“AndroidTest”的交换。

任何帮助将不胜感激。

编辑:

这是我应用的 build.gradle 文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion rootProject.compileSdkVersion
    buildToolsVersion rootProject.buildToolsVersion

    lintOptions {
        disable 'OldTargetApi'
        abortOnError false
    }

    defaultConfig {
        applicationId "com.myapp"

        minSdkVersion rootProject.minSdkVersion
        targetSdkVersion rootProject.targetSdkVersion

        versionCode rootProject.getVersionCode()
        versionName rootProject.getVersionName()

        testApplicationId "com.myapp.test"
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles 'proguard.cfg'
            signingConfig signingConfigs.release

            multiDexEnabled false
        }
        debug {
            debuggable true
            testCoverageEnabled true
            signingConfig signingConfigs.release

            multiDexEnabled true
        }
    }

    productFlavors {
       production {

       }
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }
}

【问题讨论】:

    标签: android unit-testing gradle android-testing


    【解决方案1】:

    在您的 project.properties 文件中添加以下行:

    manifestmerger.enabled=true 
    

    并重建您的应用程序。

    如果它不起作用,请检查此解决方案:

    我终于找到了解决办法。问题在于依赖关系 确实,仍然不知道为什么它曾经起作用,然后突然 拒绝,但这是您的依赖项的外观 测试模块:

    所以总而言之,您需要确保所有的库和项目 为您的测试模块列出库并标记为“已提供” 除了 Robotium lib,它是“编译”。

    发件人:Instrumentation run failed due to 'java.lang.IllegalAccessError'

    最后,如果你仍然遇到这个问题:

    旧设备运行测试时遇到问题 您的应用和检测应用的测试应用中的依赖项。

    要解决此问题,您必须弄清楚哪个 依赖导致问题。

    就我而言,它是 Dagger 和 Espresso,取决于 javax.inject 这就是它可以“修复”的方式:

    androidTestCompile('com.android.support.test.espresso:espresso-core:2.0')
    

    { 排除组:'javax.inject' }

    如果您包含更多或更奇怪的依赖项,您可以查看 this build.gradle.

    使用 espresso-contrib 时,您可能需要这样做:

    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0')
    {
        exclude group: 'javax.inject'
        exclude group: 'com.android.support'
    }
    

    发件人:Tests fail after Espresso 2 upgrade (failed: Instrumentation run failed due to 'java.lang.IllegalAccessError')

    【讨论】:

    • 感谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2018-07-24
    • 2016-02-05
    • 2012-07-29
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多