Mockito,如何使用真实的方法并获得价值

时间:2015-01-14 17:41:34

标签: java mockito

我正在使用mockito进行测试,因此我希望模拟在其AtomicIntegerField上执行增量,这是一个简化的代码。

public class MockTest {

    private AtomicInteger ai = new AtomicInteger( 0 );

    public int getAi(){
    return ai.get();
    }

    public void increment() {
    ai.getAndIncrement();
    }

    public static void main( String[] args ) {
    MockTest mt = Mockito.mock( MockTest.class, Mockito.RETURNS_DEEP_STUBS );
    Mockito.when(mt.getAi()).thenCallRealMethod();
    Mockito.doCallRealMethod().when(mt).increment();
    System.out.println(mt.getAi());
    mt.increment();
    System.out.println(mt.getAi());

    }
}

我尝试了CallRealMethod但是在执行get时我得到了NullPointerException。我还读到了关于使用Answer对象的内容,但是我对使用的争论不太满意。

1 个答案:

答案 0 :(得分:3)

从Mockito文档中,如果真实实现取决于对象的特定状态,那么您就遇到了麻烦。这正是你的情况,你是部分模拟类MockTest,然后调用方法getAi(),它取决于clase(ai)的状态。

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html

正如评论中所建议的那样,你可以使用Spy,这是相反的方法,你使用真实对象并只存在一些方法。在你的例子中,你不清楚你想要测试什么,但这就是间谍的样子。

MockTest mt = Mockito.spy(new MockTest());

System.out.println(mt.getAi());
mt.increment();
System.out.println(mt.getAi());

// Output will be
// 0
// 1

然后如果你需要存根,那么你可以说mt.getAi()方法可以这样做。

MockTest mt = Mockito.spy(new MockTest());
Mockito.when(mt.getAi()).thenReturn(100);

System.out.println(mt.getAi());
mt.increment();
System.out.println(mt.getAi());

// Output will be
// 100
// 100

请注意,部分模拟通常是代码味道,除非是非常具体的情况,例如处理难以更改的遗留代码时。

希望这有帮助。