如何从测试范围中排除 Dagger2 类

How to exclude Dagger2 classes from test coverage

是否有任何选项可以将 Dagger2 类 从 Android Studio

的测试覆盖率报告中排除

JaCoCo 排除

如果您正在使用 JaCoCo,例如使用 android 检测 连接测试 ,您需要配置 excludes (或包括),根据 documentation 是...

A list of class files to exclude from the report. May use wildcard characters (* and ?). When not specified nothing will be excluded.

这意味着您需要匹配生成的匕首 class 名称。以下规则几乎涵盖了 dagger-compiler 生成的任何 class,而不匹配任何非生成的 classes(除非您将 class 命名为与 dagger 相同的名称...... ):

excludes = [
    '**/*_MembersInjector.class',
    '**/Dagger*Component.class', // covers component implementations
    '**/Dagger*Component$Builder.class', // covers component builders
    '**/*Module_*Factory.class'
]

您可以在 运行 构建后在 app/build/generated/source/apt 目录中检查您生成的匕首 classes,看看是否有任何您想要的额外生成的 classes与排除相匹配。

这个excludes数组是jacoco插件的一个配置属性。现在,将此 excludes 数组放在哪里取决于您是基于 jacoco 插件定义自己的任务,还是使用 'higher level plugin' 为您完成此任务。例如使用 this plugin(您可以查看插件源以查看实际应用排除项的位置):

jacocoAndroidUnitTestReport {
  excludes +=  [
        '**/*_MembersInjector.class',
        '**/Dagger*Component.class',
        '**/Dagger*Component$Builder.class',
        '**/*Module_*Factory.class'
    ]
}

连接测试

如果您通过在 buildType 中设置 testCoverageEnabled true 来 运行 android 连接测试覆盖率,不幸的是没有惯用的方法来声明 excludes,因为 android gradle plugin doesn't provide such options, and the predefined jacoco report task 具有硬编码的排除项。在这种情况下,您必须使用 excludes.

编写您自己的任务脚本

IntelliJ 测试运行器

如果您使用的是IntelliJ测试运行器,无论覆盖是由IntelliJ还是JaCoCo完成,您都需要为测试配置添加includes

  1. 打开编辑配置 window:

  1. 选择您的测试配置并定义包含(classes 或整个包)。在这种情况下,我包含了整个 com.google.android.gms 包,例如:

排除 dagger生成的文件,最快的方法是把所有的dagger依赖放在一个根包里,include所有的其他 个包在测试配置中。

较新版本的 Dagger 会生成模式略有不同的附加文件。使用 Dagger 2.15

时,我成功排除了以下问题
'**/*_MembersInjector.class',
'**/Dagger*Component*.class',
'**/Dagger*Subcomponent*.class',
'**/*Subcomponent$Builder.class',
'**/*Module_*Factory.class',

从 AndroidStudio 索引中排除文件

很多天后我找到了解决方案:exclusion files from IDE index also exclude them from IDE's code coverage report.
因此我们需要为所有代码生成文件(或仅 Dagger/Hilt 文件)创建新的文件类型,并从索引中排除该文件类型。

为此你需要:

1。为 codegen-files

创建新的文件类型 'Codegen'

转到 Preferences -> File Types,并添加新文件类型 Codegen

添加此模板(模板将来可能会更改):

*_*Factory.java
*_ComponentTreeDeps.java
*_Factory.java
*_GeneratedInjector.java
*_HiltComponents.java
*_HiltModules.java
*_HiltModules_BindsModule.java
*_HiltModules_KeyModule.java
*_MembersInjector.java
*_ProvideFactory.java
*_SingletonC.java
*_TestComponentDataSupplier.java
BR.java
BuildConfig.java
DataBinderMapperImpl.java
Hilt_*.java
_test_*.java

2。从索引

中排除 'Codegen'

打开 Go to File,选择选项卡 Files,然后单击 Filter 并取消选中 Codegen 文件类型。

就这些了!

在此之后,当您将 运行 测试代码覆盖率(使用 IntelliJ IDEA 运行ner)时,匹配的代码生成文件也将从 [中的代码覆盖率报告中排除=52=].


注意:使用此方法无法从 CLI 获得覆盖。如果您需要从 CLI 获得覆盖 - 使用 Jacoco。