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

时间:2017-06-20 13:25:08

标签: testing architecture 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();

}

问题在于它还分析了测试中的类,这些类不遵循这种简单的依赖性约束。

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

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

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

2 个答案:

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