38

是否可以模拟 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.
    }
}
4

5 回答 5

79

使用Mockito's间谍机制:

A a = new A();
A aSpy = Mockito.spy(a);
Mockito.when(aSpy.method1()).thenReturn(5l);

对于任何未存根的方法,使用 spy 调用包装对象的默认行为。

Mockito.spy() / @Spy

于 2012-06-05T10:29:14.100 回答
8

使用spy()Mockito 中的方法,并像这样模拟您的方法:

import static org.mockito.Mockito.*;

...

A a = spy(new A());
when(a.method1()).thenReturn(10L);
于 2012-06-05T10:31:39.473 回答
2

根据 Mockito 的文档,接受的答案不是间谍真实对象的正确方法。

正确的方法是使用以下模式:
doReturn("foo").when(spy).get(0);

您可以在下面找到 Mockito 关于 Spy on real objects的片段。

监视真实物体的重要问题!

有时使用 when(Object) 来存根间谍是不可能或不切实际的。因此,当使用间谍时,请考虑 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不会将调用委托给传递的真实实例,而是实际创建它的副本。因此,如果您保留真实实例并与之交互,请不要期望间谍知道这些交互及其对真实实例状态的影响。推论是,当在 spy不是在真实实例上调用未存根的方法,您不会看到对真实实例的任何影响。注意最终方法。Mockito 不模拟最终方法,因此底线是:当您监视真实对象时+您尝试存根最终方法=麻烦。您也将无法验证这些方法。

于 2021-04-09T15:54:03.867 回答
1

假设您使用的是 jmockit:

public void testCase(@Mocked("methodToBeMocked") final ClassBoBeMocked mockedInstance) {
           new Expectations() {{
                   mockedInstance.methodToBeMocked(someParameter); returns(whateverYouLikeItToReturn);
           }}

   mockedInstance.callSomemethod();
}
于 2012-06-05T10:31:29.607 回答
-3

您可以简单地创建一个Aoverrides的子类method1()

于 2012-06-05T10:32:49.980 回答