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. Finally, because we actually exclude these files from the output, they are removed from the actual classpath, meaning no test classes can reference any of the below. Otherwise, I'd remove com/toddddavies/** as well */ def jacocoExcludes = [ "android/**/*", "com/cmwmobile/**" ] 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" }