如何在不计算内部委托的情况下捕获所有 mockito spied class 方法调用

How to capture all mockito spied class method invocations without counting inner delegations

假设 class 像:

public class A {
    public void smth {
    }
    public void smth2 {
        smth();
    }
}

我们用 mockito 监视它并进行简单调用:

A spiedA = spy(new A());
spiedA.smth2();

之后当我们想要检索调用计数时:

Mockito.mockingDetails(spiedA).getInvocations().size()

并且它 returns 按预期进行了两次调用。但我只想注册没有内部授权的外部电话。有没有可能达到我要求的结果?如果只有 Mockito.Invocation 可以提供调用堆栈,我会过滤掉它。

Invocation class 中有 Location location 字段。 In 实际上内部有堆栈跟踪(这实际上是私有字段,因此您应该通过反射使其可用)。之后你可以获取所需的信息,比如:

((LocationImpl)((LinkedList<Invocation>) invocations).get(1).getLocation()).stackTraceHolder.stackTrace

但我真的不建议这样做,因为您不想在将来维护该测试。 如果你真的需要,你可以将 smth() 提取到不同的 class 并监视它。

好的,问题解决了。使用自定义调用处理程序包装在 java.lang.reflect.Proxy 中。