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

Testing 如何使用ArchUnit忽略测试类中的类,testing,architecture,classpath,archunit,Testing,Architecture,Classpath,Archunit,我编写了我的第一个单元测试: import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.*; // more non-static imports @RunWith(ArchUnitRunner.class) @AnalyzeClasses(packages = "my.domain.project") public class PackageStructureTests { @ArchT

我编写了我的第一个单元测试:

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();

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

如何将测试限制在“生产”类?

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


将名称以“Tests”或其他形式结尾的类分开是不够的,因为有许多类不是测试,但只出现在测试类路径上。

似乎API在这方面没有很好的指导,因为您不是第一个对此感到疑惑的人(这也是Github上的问题1)

不过,为了回答这个问题,注释
@AnalyzeClasses
有一个额外的属性
importOptiosn
(因为ArchUnit 0.5.0是一个数组和所有选项),它可以任意实现
ImportOption
,您可以指定要包含的
位置(基本上是URI)

由于排除测试是相当常见的,所以这个
导入操作
已经预定义(对于Maven和Gradle),因此您可以编写

@AnalyzeClasses(..., importOptions = { ImportOption.DoNotIncludeTests.class })
public class MyTest { … }
我不认为所有的设置都有一个通用的解决方案(因此您可以自由地编写自己的
导入操作
来决定包含哪些位置)。但是,对于标准Maven和Gradle设置,它应该可以工作。

如果您没有使用(在编写时使用ArchUnit的JUnit4支持),而是使用“本机”ArchUnit,请使用(例如)


DontIncludeTests
已弃用(在ArchUnit 0.10.2中选中)。使用
DoNotIncludeTests
(不同的拼写)。不推荐使用ImportOption.DontIncludeTests()。请改用:
ImportOption.DoNotIncludeTests()
它可以通过Enum:ImportOption.prefined.DO\u NOT\u INCLUDE\u测试获得
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");