apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'jacoco' apply plugin: 'com.github.kt3k.coveralls' evaluationDependsOn(":app") buildscript { repositories { mavenCentral() } dependencies { // Version lock for https://github.com/kt3k/coveralls-gradle-plugin/issues/27 classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.0.1x' } } repositories { maven { url 'http://repository.jetbrains.com/repo' } } test { testLogging { exceptionFormat = 'full' } } def androidModule = project(':app') def firstVariant = androidModule.android.applicationVariants.toList().first() dependencies { compile androidModule testCompile 'junit:junit:4.+' testCompile 'org.robolectric:robolectric:+' testCompile 'org.mockito:mockito-core:+' testCompile 'com.jayway.awaitility:awaitility:+' testCompile 'org.jetbrains.spek:spek:+' testCompile firstVariant.javaCompile.classpath testCompile firstVariant.javaCompile.outputs.files testCompile files(androidModule.plugins.findPlugin("com.android.application").getBootClasspath()) } jacocoTestReport { /* Alright, setting up Jacoco the right way is massively confusing. Normally, you'd use something like additionalClassDirs to add the folders you need. However, we want to exclude the android/ folder, and likely will need something else in the future. In order to do this though, we need the doFirst block. See SO here: http://stackoverflow.com/a/17411305/1454178 Additionally, to properly exclude, we need to run that code outside the doFirst block. No clue why this is, but please don't change this without extensive testing. */ def jacocoExcludes = [ "android/**/*" ] firstVariant.javaCompile.exclude(jacocoExcludes).outputs.files doFirst { sourceDirectories = files(androidModule.android.sourceSets.main.java.srcDirs) classDirectories = firstVariant.javaCompile.outputs.files } // Back to your regularly scheduled Jacoco reports { xml.enabled true csv.enabled false html.destination "${buildDir}/jacocoHtml" } } coveralls { sourceDirs = files(androidModule.android.sourceSets.main.java.srcDirs).files.absolutePath } tasks.withType(Test) { scanForTestClasses = false include "**/*Test.class" }