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"结尾的类分开是不够的,因为有许多类不是测试,但只存在于测试类路径中.
似乎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设置,它应该正常工作.
如果您不使用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)
| 归档时间: |
|
| 查看次数: |
1518 次 |
| 最近记录: |