【问题标题】:ArchUnit rule to negate package access?ArchUnit 规则否定包访问?
【发布时间】:2026-01-20 15:55:01
【问题描述】:
我偶然发现了以下 sn-p。
ArchRule myRule = classes()
.that().resideInAPackage("..core..")
.should().onlyBeAccessed().byAnyPackage("..controller..");
我想知道如何否定这个条件,所以测试应该检查core 包是否未被controller 包访问?
【问题讨论】:
标签:
java
architecture
archunit
【解决方案1】:
您可以使用ClassesShould.accessClassesThat(),这(正如其 JavaDoc 所建议的那样)通常以否定的方式更有意义:
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
// ...
noClasses()
.that().resideInAPackage("..controller..")
.should().accessClassesThat().resideInAPackage("..core..");
您也可以坚持使用classes() 并使用GivenClasses.should(…) 或GivenClassesConjunction.should(…) 和灵活的ArchCondition。对于您的情况,它可以很容易地由预定义的条件和predicates 组成:
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAPackage;
import static com.tngtech.archunit.lang.conditions.ArchConditions.accessClassesThat;
import static com.tngtech.archunit.lang.conditions.ArchConditions.not;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
// ...
classes()
.that().resideInAPackage("..controller..")
.should(not(accessClassesThat(resideInAPackage("..core.."))));