ArchUnit能否在单测级别实现类似ImportOption.DoNotIncludeTests的过滤效果?
ArchUnit按单测维度过滤测试类的实现方案
完全可以实现,而且能和@AnalyzeClasses配置ImportOption.DoNotIncludeTests.class的行为完全对齐,不需要拆分测试类。
核心实现思路
直接复用ArchUnit内置的测试类判断逻辑——ImportOption.DoNotIncludeTests底层就是通过Tests.areTests()这个内置条件来识别测试类的,我们可以直接在架构测试的check()方法中用这个条件做反向过滤。
代码示例
你想要的链式调用方式可以这么写:
import com.tngtech.archunit.lang.Conditions; import com.tngtech.archunit.library.Architectures; import com.tngtech.archunit.lang.syntax.ConditionClasses; import com.tngtech.archunit.lang.syntax.Tests; // 你的架构测试逻辑 Architectures.onionArchitecture() .domainModels("com.example.domain..") .applicationServices("com.example.application..") .adapter("persistence", "com.example.adapter.persistence..") // 其他架构规则配置 .check(ConditionClasses.that(Conditions.not(Tests.areTests())));
如果需要复用这个过滤条件,可以封装成自定义工具方法:
import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.lang.Condition; import com.tngtech.archunit.lang.Conditions; import com.tngtech.archunit.lang.syntax.Tests; public class ArchUnitCustomConditions { public static Condition<JavaClass> areNotTests() { return Conditions.not(Tests.areTests()); } }
之后就可以像你最初设想的那样调用:
Architectures.onionArchitecture() // 架构配置 .check(ConditionClasses.that(ArchUnitCustomConditions.areNotTests()));
关键说明
Tests.areTests()的判断逻辑和ImportOption.DoNotIncludeTests完全一致:会检查类是否位于测试专用包、是否带有@Test/@TestClass等测试注解、是否是测试框架生成的类等,保证行为对齐。- 这种方式基于同一类分析集合,无需拆分测试类,可灵活控制不同测试用例是否过滤测试类。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

