从1.2.3升级android gradle插件 - > 1.5.0 =单元测试中断

时间:2015-12-09 01:37:50

标签: android unit-testing gradle android-testing

目前,我的android项目正在使用gradle插件版本1.2.3。我能够使用gradle命令" ./ gradlew clean connectedProductionAndroidTest"成功运行单元测试(android测试)。哪里"生产"是一种味道。

但是,当我将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"。注意交换"生产"和" AndroidTest"。

非常感谢任何帮助。

编辑:

这是我的app的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"
    }
}

1 个答案:

答案 0 :(得分:1)

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

manifestmerger.enabled=true 

并重建您的应用。

如果无效,请检查此解决方案:

  

我终于找到了解决方案。问题在于依赖性   事实上,它仍然是未知为什么它曾经工作,然后突然   拒绝,但这里的依赖关系应该如何   测试模块:

     

enter image description here

     

总而言之,您需要确保所有库和项目   库列出了您的测试模块并标记为“已提供”   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')