我想存儲一個存儲庫類來測試另一個具有存儲庫的類(Holder類)。存儲庫接口支持CRUD操作,並且有很多方法,但是我對Holder類的單元測試只需要調用其中的兩個。該倉庫接口:Mockito:如何在調用時使用void方法來運行一些代碼
public interface IRepo {
public void remove(String... sarr);
public void add(String... sarr);
//Lots of other methods I don't need now
}
我希望創建一個可存儲的情況下,僅add
和remove
定義邏輯,並提供檢查什麼叫添加和刪除後存儲在其上的一種手段儲存庫模擬。
如果我做的:
IRepo repoMock = mock(IRepo.class);
然後,我有一個愚蠢的對象,做每一種方法罷了。沒關係,現在我只需要定義添加和刪除行爲。
我可以創建一個Set<String>
並僅存在這兩個方法來處理該集合。然後,我會實例化一個擁有IRepo的持有者,注入部分殘留的模擬物,並且在對持有者進行鍛鍊之後,檢查該集合以驗證它包含它應該包含的內容。
我已經成功地部分存根使用過時的方法stubVoid
像remove
一個void方法:
Set<String> mySet = new HashSet<>();
stubVoid(repoMock).toAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
String[] stringsToDelete = (String[]) args[0];
mySet.removeAll(Arrays.asList(stringsToDelete));
return null;
}
}).on().remove(Matchers.<String>anyVararg());
但已被棄用,它並不比創造IRepo部分實現好得多。有沒有更好的辦法?
注:Java 7只回答請,這應該運行在Android。
有趣的怎麼沒有'doSomething'接受,而不必砍一個空白回答一個Runnable。我的使用案例到目前爲止是否被提取,它不應該在Mockito的API中? –
我懷疑有沒有滿足所有用戶的圖書館。 Mockito幾乎可以很容易地擴展(見我的答案)。順便說一下,Runnable在你的例子中不起作用,因爲你需要調用參數。 – Ruben
解決了我試圖通過測試中途強制更改某些數據的問題,謝謝! –