如何验证所有直接及间接调用post方法的方法名称不以get开头?
解决间接调用post方法的检测问题
问题描述
需要验证所有直接或间接调用post方法的方法名称均不以get为前缀,但现有代码仅能检测直接调用post的方法,无法覆盖多层间接调用的场景。现有检测代码:
methods().that().haveNameStartingWith("post") .should() .onlyBeCalled() .byMethodsThat( not( HasName.Predicates.nameStartingWith("post") ) ).check(classes);
解决方案
要覆盖间接调用场景,需要追踪完整调用链路而非仅检查直接调用者,以下是基于ArchUnit框架(从代码语法判断)的实现方案:
方法一:遍历完整调用链校验入口方法
利用callChain()追踪从顶层入口到post方法的完整调用路径,直接校验链路顶端的入口方法名称:
// 遍历所有以public方法为入口、最终调用post方法的完整链路 callChain() .startingFrom(methods().that().arePublic()) // 可根据实际需求调整入口范围,比如非私有方法 .endingAt(methods().that().haveNameStartingWith("post")) .forEach(callChain -> { // 获取调用链的顶层入口方法 JavaMethod entryMethod = callChain.getStartingPoint(); // 校验入口方法名称不以get开头 assertThat(entryMethod.getName()).doesNotStartWith("get"); });
方法二:自定义链式调用规则
贴合原有校验风格,直接定义规则要求post方法只能被不以get开头的方法发起的调用链调用:
ArchRule rule = methods().that().haveNameStartingWith("post") .should().onlyBeCalledInChainsStartingWith( methods().that().doNotHaveNameStartingWith("get") ); rule.check(classes);
关键说明
callChain()方法能穿透多层中间方法,完整还原从入口到post方法的调用路径。- 若需排除特定中间方法(如工具类方法),可在
startingFrom()中添加过滤条件,例如:methods().that().arePublic().and(not(declaredIn(UtilityClass.class)))
内容的提问来源于stack exchange,提问作者sab
相关产品推荐
相关产品推荐

