0

我想检查 FOO.model 是否只能由 FOO.service访问, 而 BAR.model 是否只能由 BAR.service访问 等等。

有没有办法用 ArchUnit 实现这一点?喜欢(伪代码)

classes()
  .that().resideInAPackage("{PLACEHOLDER}.model")
  .should().onlyBeAccessed().byAnyPackage("{PLACEHOLDER}.service");

我知道我可以编写一个迭代所有 FOO、BAR 等包的测试,或者为每个包编写一个单独的测试,但我正在寻找一个不需要的通用开箱即用解决方案每次我引入一个新包时更新我的​​测试类。

4

1 回答 1

0

您可以使用自定义条件来测试每个访问的来源:

classes()
  .that().resideInAPackage("..model")
  .should(new ArchCondition<JavaClass>("only be accessed from the corresponding service package") {
    @Override
    public void check(JavaClass javaClass, ConditionEvents conditionEvents) {
      javaClass.getAccessesToSelf().forEach(access -> {
        String originPackageName = access.getOrigin().getOwner().getPackageName();
        String targetPackageName = access.getTarget().getOwner().getPackageName();
        String expectedOriginPackageName = targetPackageName.replace(".model", ".service");
        boolean satisfied = originPackageName.equals(expectedOriginPackageName);
        conditionEvents.add(new SimpleConditionEvent(access, satisfied, access.getDescription()));
      });
    }
  });

(可能有更复杂的方法来构建 expectedOriginPackageName......)

于 2021-07-07T22:14:03.323 回答