2016-09-22 18 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

なぜ2つの異なるテストケースでそれを分離しないのですか? –

+0

[メソッドの検証方法はmockito verify()で2回呼び出されます(http://stackoverflow.com/questions/14889951/how-to-verify-a-method-is-called-two-times -with-mockito-verify) – Joe

+1

@Joe OPが同じメソッドを2回検証しているので重複していないと思います。あなたは最初の検証呼び出しの後にfをリセットしようとしましたか? 'Mockito.reset(f)'? – troig

答えて

2

バグはありません。ライブラリの実装者は、単一のテストメソッドでの複数の呼び出しはベストプラクティスではないと考えています。この問題を克服するための2つのがあり選択肢:

  1. 良い1:f.bar()呼び出しに別々のテストを使用し、独立して、それらをテストします。
  2. いいえ:Mockito.reset(f)を2回目の呼び出しの前に使用してください。それはスパイの状態をリセットしますf;たとえば、doThrow(new Exception).when(f).bar(45)のようなモックコールを挿入した場合は、reset()コールの後にリセットされます。しかし、2回目の検証はtimes(1)で動作します。
関連する問題