如何在java中模拟单个方法

时间:2012-06-05 10:26:02

标签: java mocking

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

5 个答案:

答案 0 :(得分:60)

使用Mockito's间谍机制:

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

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

Mockito.spy() / @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}}子类即可。