ArchUnit - 有没有办法用通用占位符检查包访问?

ArchUnit - is there a way to check package access with a generic placeholder?

我想看看是否 FOO.model 只能被访问 FOO.serviceBAR.model 只能被访问 BAR.service 等等。

有没有办法用 ArchUnit 实现这个?点赞(伪代码)

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

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

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

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...)