使用 ArchUnit 测试模块内的包依赖性

Test package dependencies within a module with ArchUnit

我在使用 ArchUnit 制定以下测试时遇到问题:

我想确保某个包中的所有 classes 仅访问应用程序基础包之外或某个子包内的 classes(“或”不是“异或”) .

我得到的是:

@AnalyzeClasses(packages = "com.example")
public class ClassDependencies {
    @ArchTest
    static final ArchRule deps = classes.that()
        .resideInAPackage("com.example.mymodule.some.package")
        .should().onlyAccessClassesThat().resideOutsideOfPackage("com.example..")
        .orShould().resideInAnyPackage("com.example.package1..", "com.example.package2..);

问题是,or 条件应该在 onlyAccessClassesThat() 中。如果 class 具有两种类型的访问权限,则上述公式将失败,我希望这两种类型都有效。

我怎样才能达到我想要的? 感谢您对此的任何帮助...

您可以指定提供谓词作为方法参数并将其与另一个谓词组合:

classes
    .that().resideInAPackage("com.example.mymodule.some.package")
    .should().onlyAccessClassesThat(
        JavaClass.Predicates.resideOutsideOfPackage("com.example..")
        .or(JavaClass.Predicates.resideInAnyPackage("com.example.package1..", "com.example.package2.."))
    )