2015-01-14 22 views
0

我正在使用mockito進行測試,因此我希望模擬在其AtomicIntegerField上執行增量操作,這裏是一個簡化代碼。Mockito,如何使用真實方法並獲取值

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,但是我得到了NullPointerException,執行獲取時。我還閱讀了關於使用Answer對象的問題,但是對於我所使用的爭論並不確定。

+2

你可能想要間諜而不是模擬。 – chrylis

+0

在這樣的例子中,你似乎甚至不需要模擬,你應該測試真實的對象! –

回答

3

從Mockito文檔,如果真正的實現取決於對象的具體狀態,那麼你有麻煩。這正是你的情況,你部分地嘲笑類MockTest,然後調用方法getAi(),這取決於clase(ai)的狀態。

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

正如評論所說,你可以使用間諜雖然,這是相反的做法,使用真正的對象和存根出只有一些方法。在你的例子中,你不清楚你想要測試什麼,但這是一個間諜的樣子。

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 

請考慮到部分模擬通常是除了與傳統的代碼是很難改變打交道時一樣非常特定的情況下一個代碼味道。

希望這會有所幫助。

相關問題