返回

Hilt Jacoco 覆盖率不匹配?一篇全方位指南帮你解决!

Android

Hilt 依赖项下的 Jacoco 覆盖率执行数据不匹配:全方位指南

问题

在使用 Jacoco 进行覆盖率报告时,开发者可能遇到如下错误:

[ant:jacocoReport] Execution data for class de/abc/def/MyApplication does not match.

此问题通常是由使用 Hilt 依赖项和 @HiltAndroidApp 注释引起的。

可能的原因

1. Hilt 工具生成代码

Hilt 依赖项通过生成辅助代码来注入依赖项。此代码会干扰 Jacoco 匹配执行数据,导致覆盖率报告中出现不匹配。

2. Application 类

Application 类通常包含很少的代码,这可能会导致 Jacoco 报告 0% 的覆盖率。

解决方案

有多种方法可以解决此问题:

方法 1:禁用 Hilt 覆盖率报告

android {
    buildTypes {
        debug {
            jacoco {
                excludes = ['de/abc/def/MyApplication']
            }
        }
    }
}

方法 2:移动 @HiltAndroidApp 注释

@HiltAndroidApp
class HiltInitializer : Application()

class MyApplication : Application()

方法 3:使用 Hilt Test Runner**

androidTestImplementation 'androidx.hilt:hilt-testing:1.0.0'
@HiltAndroidTest
class MyApplicationTest {
    @Before
    fun init() {
        HiltAndroidTest.init()
    }

    @Test
    fun testApplication() {
        // ...
    }
}

方法 4:使用 @IgnoreOnCoverage 注释

@HiltAndroidApp
class MyApplication : Application() {

    @IgnoreOnCoverage
    private val hiltInitializer = HiltInitializer()

    override fun onCreate() {
        super.onCreate()
        hiltInitializer.init(this)
    }
}

方法 5:修改 Classpath

jacoco {
    toolVersion = "0.8.8"
}

结论

通过遵循这些解决方案,开发者可以解决 Hilt 依赖项下的 Jacoco 执行数据不匹配问题。选择最合适的解决方案取决于项目的结构和测试策略。

常见问题解答

1. 如何判断哪种解决方案最适合我的项目?

根据 Application 类的复杂性和项目的测试策略选择解决方案。

2. 为什么 Hilt 工具生成代码会导致不匹配?

Hilt 生成的辅助代码会混淆 Jacoco 匹配执行数据。

3. 如何禁用 Hilt 覆盖率报告?

build.gradle 文件中,将 MyApplication 类排除在 Jacoco 报告之外。

4. 使用 @IgnoreOnCoverage 注释有什么缺点?

它会忽略 Hilt 生成的代码,可能导致覆盖率报告不完整。

5. 修改 Classpath 有什么影响?

它可以排除 Hilt 生成的代码,但可能需要对构建脚本进行更复杂的修改。