Getting Jacoco to work with Dagger

January 16, 2015

Writing tests for your code provides you with a number of development benefits, from proving that your code meets set requirements to ensuring that future code changes don’t introduce bugs or break existing functionality. It’s also important to know how much of your code is covered by your tests and what areas in your code aren’t yet covered.

Jacoco is a framework that creates code coverage reports that show you how much of your code has or has not been touched in your tests. This post is an excellent guide to setting up your Android Gradle project to use Jacoco.

To generate the Jacoco test coverage report, execute the following in the commandline:

./gradlew cleanTest test jacocoTestReport

If you’re using Dagger in your Android Gradle project, you might encounter the following error:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:jacocoTestReport'.
> Error while creating report

To dig deeper into this error, execute the same command with the stacktrace option:

./gradlew cleanTest test jacocoTestReport --stacktrace

In the stack trace, you’ll see an entry similar to this:

Caused by: java.io.FileNotFoundException: /app/build/intermediates/classes/debug/com/yourproject/AndroidModule$ModuleAdapter$ProvideAccountManagerProvidesAdapter.class (No such file or directory)
	at org.apache.tools.ant.types.resources.FileResource.getInputStream(FileResource.java:217)
	at org.jacoco.ant.ReportTask.createBundle(ReportTask.java:568)
	at org.jacoco.ant.ReportTask.createReport(ReportTask.java:547)
	at org.jacoco.ant.ReportTask.execute(ReportTask.java:494)
	... 67 more

Jacoco is expecting to find generated files with a single “$” in their name, but Dagger generates files with “$$” in their name. However, we don’t need to check test coverage in these generated classes, so we can tell Jacoco to ignore these files by adding the following to the “excludes” array (in addition to any existing entries) in the fileTree passed to “classDirectories”, like so:

classDirectories = fileTree(
 dir: '../app/build/intermediates/classes/debug',
 excludes: [
 '**/*InjectAdapter*.*',
 '**/*StaticInjection*.*',
 '**/*ModuleAdapter*.*'
 ]
 )
Joseph Kreiser
Joseph Kreiser
Software Developer

Looking for more like this?

Sign up for our monthly newsletter to receive helpful articles, case studies, and stories from our team.

MichiganLabs’ approach to software delivery: 3 ways delivery leads provide value
Process Team

MichiganLabs’ approach to software delivery: 3 ways delivery leads provide value

February 12, 2024

Delivery leads ensure the successful execution of custom software development. They build great teams, provide excellent service to clients, and help MichiganLabs grow. Learn what you can expect when working with us!

Read more
5 takeaways from the Do iOS conference that will benefit our clients
iOS

5 takeaways from the Do iOS conference that will benefit our clients

November 30, 2023

Read more
Simplifying the 4 forces of AI
Business

Simplifying the 4 forces of AI

April 9, 2024

Artificial Intelligence (AI) is becoming more prevalent, but less understood. Through examples of organizations leading the charge in each of these areas, I hope to empower you to make better decisions for your enterprise and career.

Read more
View more articles