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