You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证所有直接及间接调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:11:06