ArchUnit 规则否定包访问?

pix*_*xel 2 java architecture archunit

我偶然发现了以下片段。

ArchRule myRule = classes()
    .that().resideInAPackage("..core..")
    .should().onlyBeAccessed().byAnyPackage("..controller..");
Run Code Online (Sandbox Code Playgroud)

我想知道如何否定这个条件,所以测试应该检查core包是否未被controller包访问?

Man*_*red 6

您可以使用ClassesShould.accessClassesThat(),这(正如其 JavaDoc 所建议的那样)通常以否定方式更有意义:

\n
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;\n// ...\n\n  noClasses()\n      .that().resideInAPackage("..controller..")\n      .should().accessClassesThat().resideInAPackage("..core..");\n
Run Code Online (Sandbox Code Playgroud)\n

您也可以坚持classes()并用GivenClasses.should(\xe2\x80\xa6)GivenClassesConjunction.should(\xe2\x80\xa6)灵活搭配 ArchCondition。对于您的情况,它可以轻松地由预定义的条件和谓词组成:

\n
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAPackage;\nimport static com.tngtech.archunit.lang.conditions.ArchConditions.accessClassesThat;\nimport static com.tngtech.archunit.lang.conditions.ArchConditions.not;\nimport static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;\n// ...\n\n    classes()\n        .that().resideInAPackage("..controller..")\n        .should(not(accessClassesThat(resideInAPackage("..core.."))));\n
Run Code Online (Sandbox Code Playgroud)\n