簡體   English   中英

ArchUnit:如何避免對 java 類的依賴沖突

[英]ArchUnit: How to avoid dependency violation to java classes

我想驗證,給定包中的類僅指駐留在包本身中的類。 但是我得到了違反,告訴我a類依賴於例如java.lang.String,這對我來說完全沒問題。 有沒有辦法忽略基本的java包?

        @ArchTest
        static final ArchRule zeroDependencyOfDomain = noClasses().that()
            .resideInAPackage("..domain..")
            .should().dependOnClassesThat()
            .resideOutsideOfPackages("..domain..");

如果您不想顯式指定所有外部包,如java. javax. , com.google. , org.apache. 等等,你只關心項目包,那么你可以加入兩個條件,比如“域或外部庫”。

String PROJECT_PACKAGE = "com.myproject..";

DescribedPredicate<JavaClass> domainOrExternalLibPredicate = JavaClass.Predicates.resideInAnyPackage("..domain..")
    .or(JavaClass.Predicates.resideOutsideOfPackage(PROJECT_PACKAGE));

@ArchTest
static final ArchRule zeroDependencyOfDomain = classes().that()
    .resideInAPackage("..domain..")
    .should().onlyDependOnClassesThat()
    .resideInAnyPackage(domainOrExternalLibPredicate);

在這個種姓中,外部庫被定義為你的PROJECT_PACKAGE之外的任何東西。

您可以顯式地允許依賴於 java 包:

@ArchTest
static final ArchRule zeroDependencyOfDomain = noClasses().that()
    .resideInAPackage("..domain..")
    .should().dependOnClassesThat()
    .resideOutsideOfPackages("..domain..", "java..");

您還可以使用classes()onlyDependOnClassesThat() ,我認為這更容易閱讀:

@ArchTest
static final ArchRule zeroDependencyOfDomain = classes().that()
    .resideInAPackage("..domain..")
    .should().onlyDependOnClassesThat()
    .resideInAnyPackage("..domain..", "java..");

與其他答案類似,我也沒有找到比這更好的方法:

private static final String[] COMMON_PACKAGES = {
    "java..",
    "javax..",
    "com.google..",
    "org.springframework.."};

@ArchTest
final ArchRule classesInProdutPackageNoOutsideAccess =
    classes()
        .that()
        .resideInAnyPackage(PACKAGE_FOO)
        .should()
        .onlyAccessClassesThat()
        .resideInAnyPackage(commonPackagesAnd(PACKAGE_FOO));


private static String[] commonPackagesAnd(String... packages) {
    return ArrayUtils.addAll(packages, COMMON_PACKAGES);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM