如何用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
相关产品推荐
相关产品推荐

