Java Coverage
JaCoCo code coverage configuration for Java/Gradle projects.
When to use this skill
-
Setting up code coverage reporting
-
Configuring coverage thresholds
-
Aggregating coverage across modules
-
Integrating with SonarQube
-
Troubleshooting coverage reports
-
When asked to "improve test coverage"
Skill Contents
Sections
-
When to use this skill
-
Quick Start
-
Coverage Thresholds
-
Exclusions
-
Multi-Module Aggregation
-
SonarQube Integration
-
Checking Coverage via SonarQube MCP
-
References
-
Related Rules
-
Related Skills
Available Resources
references/ - Detailed documentation
-
coverage targets
-
coverage via mcp
-
exclusion patterns
-
improvement workflow
-
multi module
-
prioritization
Quick Start
- Apply JaCoCo Plugin
plugins { id 'jacoco' }
jacoco { toolVersion = "0.8.14" }
- Configure Report Task
jacocoTestReport { dependsOn test
reports {
xml.required = true // For SonarQube
html.required = true // For local viewing
}
}
test { finalizedBy jacocoTestReport }
- Run Coverage
./gradlew test jacocoTestReport
Report at: build/reports/jacoco/test/html/index.html
Coverage Thresholds
jacocoTestCoverageVerification { violationRules { rule { limit { minimum = 0.80 // 80% minimum coverage } }
rule {
element = 'CLASS'
excludes = ['*.generated.*', '*.config.*']
limit {
counter = 'LINE'
minimum = 0.70
}
}
}
}
check.dependsOn jacocoTestCoverageVerification
Exclusions
Common patterns to exclude from coverage:
jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: [ '/generated/', '/config/', '/*Config.class', '/*Properties.class', '**/Application.class' ]) })) } }
Multi-Module Aggregation
For aggregated reports across modules, use the modern jacoco-report-aggregation plugin (Gradle 7.4+):
// In root build.gradle plugins { id 'base' id 'jacoco-report-aggregation' }
// Ensure subprojects are evaluated first subprojects.each { evaluationDependsOn(it.path) }
dependencies { subprojects.each { jacocoAggregation it } }
reporting { reports { testCodeCoverageReport(JacocoCoverageReport) { testType = TestSuiteType.UNIT_TEST } } }
For older Gradle versions, use a manual task with defensive filtering:
// In root build.gradle (Gradle < 7.4) task jacocoRootReport(type: JacocoReport) { dependsOn subprojects*.test
// Use defensive filtering to avoid missing-directory errors
def srcDirs = files(subprojects*.sourceSets*.main*.allSource*.srcDirs).filter { it.exists() }
def classDirs = files(subprojects*.sourceSets*.main*.output).filter { it.exists() }
def execData = files(subprojects*.jacocoTestReport*.executionData).filter { it.exists() }
additionalSourceDirs.from(srcDirs)
sourceDirectories.from(srcDirs)
classDirectories.from(classDirs)
executionData.from(execData)
reports {
xml.required = true
html.required = true
}
}
SonarQube Integration
sonar { properties { property 'sonar.coverage.jacoco.xmlReportPaths', "${projectDir}/build/reports/jacoco/test/jacocoTestReport.xml" } }
Checking Coverage via SonarQube MCP
Instead of running local JaCoCo builds to check current coverage state, use SonarQube MCP tools for faster feedback:
Tool Purpose
search_files_by_coverage
Find files with lowest coverage
get_file_coverage_details
Line-by-line coverage for a specific file
get_component_measures
Project/module-level coverage metric
get_project_quality_gate_status
Check if coverage gate passes
Find low-coverage files
search_files_by_coverage: projectKey: "my-service"
Check specific file coverage
get_file_coverage_details: key: "my-service:src/main/java/com/bitso/Service.java"
Check overall coverage
get_component_measures: component: "my-service", metricKeys: ["coverage"]
MCP reflects the last CI analysis. Use JaCoCo locally to generate new coverage after writing tests.
See fix-sonarqube coverage reference for the full MCP coverage workflow.
References
Reference Description
references/exclusion-patterns.md Common exclusion patterns
references/multi-module.md Multi-module aggregation
Related Rules
- java-jacoco-coverage - Full JaCoCo reference
Related Skills
Skill Purpose
java-testing Test configuration
fix-sonarqube SonarQube setup
gradle-standards Gradle configuration