25

我写了我的第一个 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”或其他名称结尾的类分开是不够的,因为有许多类不是测试,但仅存在于测试类路径中。

4

2 回答 2

29

似乎 API 在这方面的指导不是很好,因为您不是第一个对此感到疑惑的人(这也是 Github 上的问题 #1 https://github.com/TNG/ArchUnit/issues/1)。

不过,为了回答这个问题,Annotation@AnalyzeClasses有一个额外的属性importOptiosn(因为 ArchUnit 0.5.0 是一个数组 ANDing 所有选项),它采用任意实现ImportOption,您可以在其中指定Location要包含的(基本上是 URI)。

由于排除测试相当普遍,这ImportOption已经是预定义的(对于 Maven 和 Gradle),因此您可以编写

@AnalyzeClasses(..., importOptions = { ImportOption.DoNotIncludeTests.class })
public class MyTest { … }

我认为没有适用于所有设置的通用解决方案(因此可以自由编写自己的ImportOption设置来决定要包含哪些位置)。但是,对于标准 Maven 和 Gradle 设置,它应该可以工作。

于 2017-06-21T16:47:47.243 回答
6

如果您没有使用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");
于 2018-05-17T14:20:37.777 回答