「集約に含まれるオブジェクトは集約ルートからのみ依存される」ことをテストしてみる。
テストコード
@AnalyzeClasses(packages = "com.example")
public class DomainObjectTest {
@ArchTest
static ArchRule aggregate_object_be_depended_on_only_root_object =
noClasses()
.that().resideInAPackage("com.example")
.should().dependOnClassesThat(new DescribedPredicate<>("domain.hoge") {
@Override
public boolean apply(final JavaClass clazz) {
return clazz.getPackageName().startsWith("com.example.domain.hoge")
&& clazz.getSimpleName().equals("HogeRoot");
}
});
集約が特定のパッケージ配下に含まれている前提で、集約ルート以外のオブジェクトが他のクラスから依存されていないことをテストしている。
この場合だと、一時的な参照を渡すことも出来ないため、dependOnClassThat
の代わりにcallMethod
を用いて判定しても良いかもしれない。