是否可以模拟Java类的单个方法?
例如:
class A {
long method1();
String method2();
int method3();
}
// in some other class
class B {
void someMethod(A a) {
// how would I mock A.method1(...) such that a.method1() returns a value of my
// choosing;
// whilst leaving a.method2() and a.method3() untouched.
}
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*n B 64
使用Mockito's间谍机制:
A a = new A();
A aSpy = Mockito.spy(a);
Mockito.when(aSpy.method1()).thenReturn(5l);
Run Code Online (Sandbox Code Playgroud)
使用spy会为任何非stubed方法调用包装对象的默认行为.
使用spy()Mockito中的方法,并像这样模拟你的方法:
import static org.mockito.Mockito.*;
...
A a = spy(new A());
when(a.method1()).thenReturn(10L);
Run Code Online (Sandbox Code Playgroud)
根据 Mockito 的文档,接受的答案不是监视真实对象的正确方法。
正确的方法是使用以下模式:
doReturn("foo").when(spy).get(0);
您可以在下面找到来自 Mockito 的关于监视真实对象的片段。
关于监视真实物体的重要问题!
有时使用when(Object)来存根间谍是不可能或不切实际的。因此,当使用间谍时,请考虑 doReturn|Answer|Throw() 系列方法进行存根。例子:Run Code Online (Sandbox Code Playgroud)List list = new LinkedList(); List spy = spy(list); //Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty) when(spy.get(0)).thenReturn("foo"); //You have to use doReturn() for stubbing doReturn("foo").when(spy).get(0);Mockito不会将调用委托给传递的真实实例,而是实际上创建它的副本。因此,如果您保留真实实例并与其交互,则不要指望间谍能够意识到这些交互及其对真实实例状态的影响。推论是,当在间谍上调用未存根的方法而不是在真实实例上调用时,您不会看到对真实实例有任何影响。注意最终方法。Mockito 不会模拟最终方法,因此底线是:当你监视真实对象时+你尝试存根最终方法=麻烦。此外,您也将无法验证这些方法。
| 归档时间: |
|
| 查看次数: |
49581 次 |
| 最近记录: |