如果我有一个像这样的包结构:
org.myapp
我想编写一个 archunit 测试来检查功能包内的所有类是否仅引用同一功能包内的其他类或外部类或公共包中的类。
我已经能够使用分层架构(见下文)来实现此测试,但这迫使我实际上对每个功能分支的名称进行硬编码,并且我希望使其能够面向未来,以便如果添加一个功能包,则测试也会检查一下。
@ArchTest
public static final ArchRule layer_arquitecture = layeredArchitecture().consideringAllDependencies()
.layer("common").definedBy("org.myapp.common..")
.layer("feature1").definedBy("org.myapp.feature1..")
.layer("feature1").definedBy("org.myapp.feature2..")
.whereLayer("feature1").mayNotBeAccessedByAnyLayer()
.whereLayer("feature2").mayNotBeAccessedByAnyLayer();
SlicesRuleDefinition
可能会有所帮助,另请参阅 SlicesIsolationTest
来自 ArchUnit-Examples。
@ArchTest
public static final ArchRule featuresShouldBeIndependent = SlicesRuleDefinition
.slices().matching("org.myapp.(*)..")
.should().notDependOnEachOther();
除非您能找到一个不拾取 PackageMatcher
的
"org.myapp.(feature*).."
(如 "org.myapp.common.."
),否则您可能必须使用 SliceRule
的 ignoreDependency
,大概是这样的:
@ArchTest
public static final ArchRule featuresShouldBeIndependent = SlicesRuleDefinition
.slices().matching("org.myapp.(*)..")
.should().notDependOnEachOther()
.ignoreDependency(
/* originPredicate = */ DescribedPredicate.alwaysTrue(),
/* targetPredicate = */ JavaClass.Predicates.resideInAPackage("org.myapp.common..")
);