ArchUnit - 有没有办法用通用占位符检查包访问?
ArchUnit - is there a way to check package access with a generic placeholder?
我想看看是否
FOO.model
只能被访问
FOO.service
和
BAR.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
...)
我想看看是否 FOO.model 只能被访问 FOO.service 和 BAR.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
...)