【问题标题】:Jacoco code coverage for android application using mockito library使用 mockito 库的 android 应用程序的 Jacoco 代码覆盖率
【发布时间】:2014-09-19 01:29:07
【问题描述】:

我的 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)

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

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

【问题讨论】:

    标签: android mockito code-coverage jacoco


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      自 0.10.0 起,已将 Jacoco 覆盖支持添加到 gradle 插件中。见http://tools.android.com/tech-docs/new-build-system

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

      【讨论】:

      • gradle 文件并不复杂。唯一感兴趣的是我应用 jacoco 插件并随后在调试构建类型中启用代码覆盖的地方。但是,jacoco 的东西似乎不适用于 dexmaker mockito 版本,这就是我的问题所在。
      • 我不确定您是否需要应用 jacoco 插件。我将不得不挖掘一个脚本来看看我必须做什么。但是,有一些可用的示例可能会有所帮助。
      • 忽略关于为 jacoco 应用插件的部分,一旦我启用代码覆盖,我使用 mockito 的测试开始失败,这是根本问题......
      【解决方案3】:

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

      compileOptions {
          sourceCompatibility JavaVersion.VERSION_1_5
          targetCompatibility JavaVersion.VERSION_1_5
      }
      

      【讨论】:

        【解决方案4】:

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

        此问题已在构建工具版本 21+ 中得到修复

        android {
        buildToolsVersion "21.1.2"
        compileSdkVersion 19
        
        ...
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-14
          • 2015-03-21
          • 2015-05-21
          • 1970-01-01
          • 2016-11-11
          • 2019-01-02
          • 2012-11-02
          • 1970-01-01
          相关资源
          最近更新 更多