2016-09-22 141 views
0
static class Foo { 
    public void bar(int i) {} 
} 

@Test 
public void foo() { 
    Foo f = Mockito.spy(new Foo()); 
    f.bar(42); 
    Mockito.verify(f, Mockito.times(1)).bar(42); 
    f.bar(42); 
    Mockito.verify(f, Mockito.times(1)).bar(42); 
} 

導致org.mockito.exceptions.verification.TooManyActualInvocations(想要1次,但是2)在最後一行。在調試顯示中運行它,InvocationMatcher忽略了第一個調用已被驗證的事實。它不取決於女巫確切的匹配器傳遞到bar。我做錯了什麼,或者它是Mockito的錯誤?Mockito驗證已驗證的調用

+0

爲什麼不把它分爲兩個不同的測試用例? –

+0

[如何用mockito verify()方法調用兩次驗證方法的可能副本(http://stackoverflow.com/questions/14889951/how-to-verify-a-method-is-called-two-times -with-mockito-verify) – Joe

+1

@Joe我認爲這不是重複的,因爲OP正在驗證兩次相同的方法。你有沒有嘗試在第一次驗證調用後重新設置f:'Mockito.reset(f)'? – troig

回答

2

沒有錯誤。圖書館的實施者認爲在單一測試方法中多次調用並不是最佳實踐。有兩種選擇來解決這個問題:

  1. 好一個:使用單獨的測試每個f.bar()調用和獨立測試。
  2. 不好:在第二次調用之前使用Mockito.reset(f)。它重置了間諜f的狀態;例如,如果您插入了模擬電話,如doThrow(new Exception).when(f).bar(45),則會在撥打reset()後重置。但第二次驗證適用於times(1)