是否可以模拟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.
}
}
答案 0 :(得分:60)
使用Mockito's
间谍机制:
A a = new A();
A aSpy = Mockito.spy(a);
Mockito.when(aSpy.method1()).thenReturn(5l);
使用spy会为任何未存根的方法调用包装对象的默认行为。
答案 1 :(得分:6)
使用spy()
method from Mockito,并按照以下方式模拟您的方法:
import static org.mockito.Mockito.*;
...
A a = spy(new A());
when(a.method1()).thenReturn(10L);
答案 2 :(得分:1)
假设你正在使用jmockit:
public void testCase(@Mocked("methodToBeMocked") final ClassBoBeMocked mockedInstance) {
new Expectations() {{
mockedInstance.methodToBeMocked(someParameter); returns(whateverYouLikeItToReturn);
}}
mockedInstance.callSomemethod();
}
答案 3 :(得分:0)
根据 Mockito 的文档,接受的答案不是窥探真实对象的正确方法。
正确的做法是使用以下模式:
doReturn("foo").when(spy).get(0);
您可以在下方找到 Mockito 关于 Spying on real objects 的片段。
<块引用>关于监视真实物体的重要问题!
有时这是不可能的或
将 when(Object) 用于 stubbing 间谍是不切实际的。因此当
使用 spies 请考虑 doReturn|Answer|Throw() 系列方法
为存根。示例:
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 不委托调用 到传递的真实实例,它实际上创建了它的副本。 所以如果你保留真实的实例并与之交互,不要期望 间谍要意识到这些互动及其对真实世界的影响 实例状态。推论是,当 unstubbed 方法是 在间谍上调用但不在真实实例上,你不会看到任何 对真实实例的影响。注意最后的方法。莫基托 不模拟最终方法,所以底线是:当你监视真实的 对象 + 你试图存根一个最终方法 = 麻烦。你也不会 也可以验证这些方法。
答案 4 :(得分:-2)
您只需创建一个覆盖A
的{{1}}子类即可。