![](/img/trans.png)
[英]How to check that a constructor is called in the right classes with ArchUnit?
[英]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.