Покрытие кода Jacoco для приложения Android с использованием библиотеки mockito

Мое приложение для Android использует следующую конфигурацию:

  • Грейдл - 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 для тестирования?


person Mahesh    schedule 27.07.2014    source источник


Ответы (4)



Поддержка покрытия Jacoco была добавлена ​​в плагин Gradle с версии 0.10.0. См. http://tools.android.com/tech-docs/new-build-system.

Не совсем уверен, что понимаю, почему у вас такой сложный файл градиента.

person binarycreations    schedule 27.07.2014
comment
Файл gradle не сложный. Интерес представляет только место, где я применяю плагин jacoco и впоследствии включаю покрытие кода в типе сборки отладки. Тем не менее, материал jacoco, похоже, не очень хорошо работает с версией mockito dexmaker, и это то, о чем мой вопрос был больше. - person Mahesh; 28.07.2014
comment
Я не уверен, что вам нужно применять плагин jacoco. Мне придется выкопать сценарий, чтобы увидеть, что я должен был сделать. Однако есть несколько доступных образцов, которые могут помочь. - person binarycreations; 28.07.2014
comment
Игнорируя часть о применении плагина для jacoco, как только я включаю покрытие кода, мои тесты, в которых используется mockito, начинают давать сбой, и это основная проблема... - person Mahesh; 29.07.2014

Вам нужно скомпилировать версию Java 1.5.

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_5
    targetCompatibility JavaVersion.VERSION_1_5
}
person Yuvi    schedule 10.09.2014

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

Эта проблема была исправлена ​​в инструментах сборки версии 21+.

android {
buildToolsVersion "21.1.2"
compileSdkVersion 19

...
}

Обновите инструменты сборки до версии 21+, чтобы сохранить совместимость с Java 1.7.

person Some Noob Student    schedule 16.01.2015