如何在不计算内部委托的情况下捕获所有 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 中。
假设 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 中。