2012-11-13 30 views
0

我有2類實現一個接口。模擬2個實現與Mockito接口的類的適當方法是什麼?

public interface DataAccess { /*....*/ } 
public class DataAccessCache implements DataAccess { /*...*/ } 
public class DataAccessMemory implements DataAccess { /*...*/ } 

現在我有一個名爲CPU封裝另一個類DataAccessCacheDataAccessMemory(均爲私有實例瓦爾),如:

private DataAccessCache cache; 
private DataAccessMemory memory; 

嘲笑這兩個類,我有2種setter方法:

public void setDataAccessCache(DataAccessCache cache) { 
    this.cache = cache; 
} 

public void setDataAccessMemory(DataAccessMemory memory) { 
    this.memory = memory; 
} 

我想測試CPU方法put(String key, String value)這將把key-value對進入內存和緩存。我想確保緩存的put方法和內存的put方法在CPU的put方法內調用。我測試像這樣(使用的Mockito):

public void test() { 
    CPU cpu = new cpu(); 
    DataAccessCache cache = mock(DataAccessCache.class); 
    DataAccessMemory memory = mock(DataAccessMemory.class); 
    when(cache.put("key", "value")).thenReturn(true); 
    when(memory.put("key", "value")).thenReturn(true); 
    cpu.setDataAccessCache(cache); 
    cpu.setDataAccessMemory(memory); 
    cpu.put("key", "value"); 
    verify(cache).put("key", "value"); 
    verify(memory).put("key", "value"); 
} 

然而,測試結果指出有一個錯誤:

java.lang.NullPointerException 
at CPU.put(Unknown Source) 
at CPUTest.test(Unknown Source) 

我怎樣才能讓這對嗎?

+3

很難說沒有CPU.put的代碼 –

+0

你是對的Peter。在實現CPU.put()時,它具有用於相互排除的鎖定系統。這意味着,我必須獲取()和釋放()鎖定的部分。問題是我沒有嘲笑這些鎖,我們在這裏,CPU.put()無法繼續。謝謝。 – knd

+0

沒問題 - 很高興你發現它 –

回答

0

你應該在最後驗證你的嘲笑。

public void test() { 
    CPU cpu = new cpu(); 
    DataAccessCache cache = mock(DataAccessCache.class); 
    DataAccessMemory memory = mock(DataAccessMemory.class); 
    cpu.setDataAccessCache(cache); 
    cpu.setDataAccessMemory(memory); 
    cpu.put("key", "value"); 
    verify(cache).put("key", "value"); 
    verify(memory).put("key", "value"); 
} 
+0

謝謝你嘗試ShyJ。這不是你在這裏指定的問題。閱讀上面的評論。 – knd

0

試試這樣說:

public void test() { 
    CPU cpu = new cpu(); 
    DataAccessCache cache = spy(new DataAccessCache()); 
    DataAccessMemory memory = spy(new DataAccessMemory()); 
    //when(cache.put("key", "value")).thenReturn(true); 
    doReturn(true).when(cache).put(eq("key"), eq("value")); 
    //when(memory.put("key", "value")).thenReturn(true); 
    doReturn(true).when(memory).put(eq("key"), eq("value")); 
    cpu.setDataAccessCache(cache);   
    cpu.setDataAccessMemory(memory); 
    cpu.put("key", "value"); 
    verify(cache).put("key", "value"); 
    verify(memory).put("key", "value"); 
} 

我還沒有把這個到IDE中,只需鍵入從我的頭頂,但我認爲我是正確的。嘗試一下。

相關問題