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

如何用ArchUnit规则校验以IT结尾的类需在integrationTest模块(Gradle)

解决ArchUnit校验IT结尾类必须在integrationTest模块的问题

核心思路

ArchUnit本身没有直接的模块校验API,但可以通过类的源文件路径间接判断所属模块——Gradle中main和integrationTest的源目录是明确区分的(默认是src/main/java和src/integrationTest/java),只要校验类文件的路径包含integrationTest目录即可。

步骤1:配置Gradle源集与ArchUnit依赖

确保项目正确配置integrationTest源集,并引入ArchUnit依赖:

Groovy DSL(build.gradle)

sourceSets {
    integrationTest {
        java.srcDir file('src/integrationTest/java')
        resources.srcDir file('src/integrationTest/resources')
        compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath
        runtimeClasspath += output + compileClasspath
    }
}

dependencies {
    testImplementation 'com.tngtech.archunit:archunit-junit5:1.2.1'
    integrationTestImplementation 'com.tngtech.archunit:archunit-junit5:1.2.1'
}

tasks.register('integrationTest', Test) {
    description = 'Runs integration tests'
    group = 'verification'
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
    shouldRunAfter test
}

Kotlin DSL(build.gradle.kts)

sourceSets {
    create("integrationTest") {
        java.srcDir("src/integrationTest/java")
        resources.srcDir("src/integrationTest/resources")
        compileClasspath += sourceSets.main.get().output + configurations.testRuntimeClasspath
        runtimeClasspath += output + compileClasspath
    }
}

dependencies {
    testImplementation("com.tngtech.archunit:archunit-junit5:1.2.1")
    integrationTestImplementation("com.tngtech.archunit:archunit-junit5:1.2.1")
}

tasks.register<Test>("integrationTest") {
    description = "Runs integration tests."
    group = "verification"
    testClassesDirs = sourceSets["integrationTest"].output.classesDirs
    classpath = sourceSets["integrationTest"].runtimeClasspath
    shouldRunAfter(tasks.test)
}

步骤2:编写ArchUnit规则

在src/integrationTest/java下创建测试类,通过检查类的源路径实现校验:

import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;

@AnalyzeClasses(
        packages = "你的项目根包名", // 替换为实际根包路径
        importOptions = {ImportOption.DoNotIncludeJars.class}
)
public class IntegrationTestLocationRule {

    @ArchTest
    public static final ArchRule it_classes_must_be_in_integration_test_module =
            classes()
                    .that().haveSimpleNameEndingWith("IT")
                    .should().satisfy(javaClass -> {
                        String classResourcePath = javaClass.getResource().getPath();
                        // 匹配integrationTest目录,可根据实际目录结构调整
                        if (!classResourcePath.contains("/src/integrationTest/")) {
                            throw new AssertionError(
                                    "类 " + javaClass.getSimpleName() + " 以IT结尾但不在integrationTest模块中,路径:" + classResourcePath
                            );
                        }
                    });
}

注意事项

  • 若项目使用Kotlin,只需将测试类改为Kotlin语法,校验逻辑完全一致。
  • Windows系统下,类资源路径仍会使用/分隔符,无需额外处理\。
  • 执行./gradlew integrationTest即可触发规则校验,确保所有IT类都在正确模块中。

内容的提问来源于stack exchange,提问作者amc18906

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:55:03