使用mockito库的Android应用程序的Jacoco代码覆盖率

时间:2014-07-27 20:37:09

标签: android mockito code-coverage jacoco

我的Android应用程序使用以下配置:

  • Gradle - 0.12。+

build.gradle文件的内容

buildscript {
repositories {
    mavenCentral()
}

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

repositories {
mavenLocal()
mavenCentral()
}

apply plugin: 'com.android.library'
apply plugin: "jacoco"



dependencies {

compile 'commons-collections:commons-collections:3.2.1'
compile 'org.slf4j:slf4j-android:1.6.1-RC1'

// dependency injection
compile('org.roboguice:roboguice:2.0') {
    exclude module: 'cglib'
    exclude module: 'aopalliance'
    exclude module: 'guice'
}

compile files('libs/guice-3.0-no_aop.jar')
compile 'javax.inject:javax.inject:1'



/*
 * Test dependencies.
 */
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'

}

android {
buildToolsVersion "20.0"
compileSdkVersion 19

buildTypes {
    debug {
        runProguard false
        testCoverageEnabled true
    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

defaultConfig {
    minSdkVersion 8
    targetSdkVersion 19
    versionCode 100
    versionName "1.0.0"
}

/*
 * Workaround for packaging bug in Android Gradle plugin regarding duplicate files.
 */
packagingOptions {
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'LICENSE.txt'
}
}

当属性testCoverageEnabled设置为false时,我的所有测试都成功运行。将其设置为true时,运行测试时会抛出以下异常

Caused by: java.lang.VerifyError: *** Some class ***
at dalvik.system.DexFile.defineClass(Native Method)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:211)
at dalvik.system.DexPathList.findClass(DexPathList.java:313)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:51)
at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
at java.lang.ClassLoader.loadClass(ClassLoader.java:461)

在测试中初始化模拟时,错误发生在该行上。

有没有人设法为Android应用程序生成使用mockito库进行测试的代码覆盖率指标?

4 个答案:

答案 0 :(得分:1)

以下链接在解释我遇到的问题时非常有用:http://www.androidpuzzles.com/168_17620080/

我随后将源和目标兼容性设置切换到Java 1.5,我能够运行单元和UI测试(使用mockito和espresso)并使用Jacoco生成代码覆盖率报告。

如果我必须保留Java 1.7设置,则解决方法是将要测试的类中的私有方法的范围更改为受保护或公共范围。这将允许我生成代码覆盖率报告(克服包含链接中标识的问题)。

答案 1 :(得分:0)

自0.10.0起,Jacoco coverage支持已添加到gradle插件中。请参阅http://tools.android.com/tech-docs/new-build-system

我不太清楚为什么你有这么复杂的gradle文件。

答案 2 :(得分:0)

您需要针对Java 1.5版本进行编译。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_5
    targetCompatibility JavaVersion.VERSION_1_5
}

答案 3 :(得分:0)

https://code.google.com/p/android/issues/detail?id=69174

此问题已在构建工具版本21 +

中修复
android {
buildToolsVersion "21.1.2"
compileSdkVersion 19

...
}

将构建工具升级到21+以保持Java 1.7兼容性。