如何使用ArchUnit忽略测试类中的类

Jen*_*der 9 architecture testing classpath archunit

我写了我的第一个ArchUnit测试:

import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.*;
// more non-static imports

@RunWith(ArchUnitRunner.class)
@AnalyzeClasses(packages = "my.domain.project")
public class PackageStructureTests {

    @ArchTest public static final ArchRule NO_CYCLES = slices().matching("my.domain.project.(**)")
            .namingSlices("package:$1").should().beFreeOfCycles();

}
Run Code Online (Sandbox Code Playgroud)

问题是它还分析了测试中的类,这些类不遵循那个简单的依赖约束.

如何将测试限制为"生产"类?

该项目使用Maven构建,因此这些类位于不同的目录中.

将名称以"Tests"结尾的类分开是不够的,因为有许多类不是测试,但只存在于测试类路径中.

pet*_*e83 8

似乎API对此没有很好的指导,因为你不是第一个对此感到疑惑的人(这也是Github上的问题#1 https://github.com/TNG/ArchUnit/issues/1).

要回答这个问题,Annotation @AnalyseClasses有一个额外的属性importOption(在ArchUnit 0.5.0中它将是一个ANDing所有选项的数组),它采用任意实现ImportOption,您可以在其中指定Location要包含的(基本上是URI).

由于排除测试很常见,这ImportOption已经预定义了(对于Maven和Gradle <4.0),所以你可以写

@AnalyzeClasses(..., importOption = ImportOption.DontIncludeTests.class)
public class MyTest{ ... }
Run Code Online (Sandbox Code Playgroud)

我不认为,所有设置都有一个通用的解决方案(因此可以自由编写自己的解决方案ImportOption来决定要包含哪些位置).但是,对于标准Maven和Gradle设置,它应该正常工作.


Mar*_*lte 5

如果您不使用archunit-junit(ArchUnit 的 JUnit4 支持作为写作时间),而是使用“本机”ArchUnit,请使用(例如)

com.tngtech.archunit.core.domain.JavaClasses classes 
  = new com.tngtech.archunit.core.importer.ClassFileImporter()
    .withImportOption(
      new com.tngtech.archunit.core.importer.ImportOption.DoNotIncludeTests())
    .importPackages("my.random.package");
Run Code Online (Sandbox Code Playgroud)

  • 它可以通过枚举获得:ImportOption.Predefined.DO_NOT_INCLUDE_TESTS (3认同)