如何在不计算内部委派的情况下捕获所有模仿间谍类方法的调用

时间:2018-10-31 09:06:52

标签: java mockito spy method-invocation

假设使用类似这样的类:

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

我们通过模仿来监视它,并进行一个简单的调用:

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

之后,当我们要检索通话计数时:

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

它按预期返回两个调用。但是我只想注册外部呼叫,而无需内部代表团。是否有可能达到我要求的结果?如果只有Mockito.Invocation可以提供调用堆栈,我会过滤掉它。

2 个答案:

答案 0 :(得分:0)

Location location类中有Invocation字段。中实际上具有堆栈跟踪(实际上是私有字段,因此您应该通过反射使它可用)。然后,您可以获取所需的信息,诸如此类:

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

但是我真的不建议这样做,因为您将来不想维护该测试。 您可以将smth()提取到不同的类中,并在确实需要时对其进行监视。

答案 1 :(得分:0)

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