我写了第一个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();
}
问题在于它还分析了测试中的类,这些类不遵循这种简单的依赖性约束。
如何将测试限制为“生产”类?
项目是使用Maven构建的,因此这些类位于不同的目录中。
将名称以“Tests”结尾的类分开是不够的,因为有许多类不是测试,但只存在于测试类路径中。
答案 0 :(得分:5)
似乎API对此没有很好的指导,因为你并不是第一个对此感到疑惑的人(这也是Github https://github.com/TNG/ArchUnit/issues/1上的问题#1)。
要回答这个问题,注释@AnalyseClasses
有一个额外的属性importOption
(在ArchUnit 0.5.0中它将是一个数组ANDing所有选项),它采用{{1的任意实现您可以在其中指定要包含的ImportOption
(基本上是URI)。
由于排除测试相当常见,因此Location
已预定义(对于Maven和Gradle< 4.0),因此您可以编写
ImportOption
我不认为,所有设置都有一个通用的解决方案(因此可以自由编写自己的@AnalyzeClasses(..., importOption = ImportOption.DontIncludeTests.class)
public class MyTest{ ... }
来决定要包含哪些位置)。但是,对于标准Maven和Gradle设置,它应该正常工作。
答案 1 :(得分:1)
如果你没有使用cppreference(ArchUnit' JUnit4-support作为写作时间),而是使用" native" ArchUnit,使用(例如)
final JavaClasses classes = new ClassFileImporter()
.withImportOption(new ImportOption.DontIncludeTests())
.importPackages("<some-package>");