使用 archunit 强制所有子包仅引用“公共”包本身

问题描述 投票:0回答:1

如果我有一个像这样的包结构:

org.myapp

  • 常见
  • 功能1
  • 功能2
  • ...

我想编写一个 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();
java unit-testing junit archunit
1个回答
0
投票

我认为

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..")
        );
© www.soinside.com 2019 - 2024. All rights reserved.