You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:20:03