Mockito はとても便利で、たとえばこんな風にするだけで「このメソッドが叩かれたか?」というチェックができる:
MyObj obj = spy(new MyObj()); doNothing().when(obj).firedMyEvent(); // 実際の処理を無視しておく obj.doSomething(); // 内部で1回だけ`MyObj#firedMyEvent`が叩かれる verify(obj, times(1)).firedMyEvent(); // ここでassert
よくある利用ケースとして、何回か同じイベントが叩かれることをチェックしたい時がある:
MyObj obj = spy(new MyObj()); doNothing().when(obj).firedMyEvent(); { obj.doSomething(); verify(obj, times(1)).firedMyEvent(); } // ここで`reset(obj)`すればいいか? { obj.doSomething(); // もう一回呼ぶ verify(obj, times(1)).firedMyEvent(); // またここで発火していたことを確認したいが...? }
しかし上記のテストは失敗する。obj
自身はinvocationのカウンタを持ち続けているのでtimes(1)
ではなくtimes(2)
になってしまうわけだ。
安直に org.mockito.Mockito.reset
でリセットしてしまうと、冒頭のdoNothing
でmockした箇所までリセットしてしまい面倒だ。
カウンタだけリセットし、また1からカウントするには以下のようにすればよい:
MyObj obj = spy(new MyObj()); doNothing().when(obj).firedMyEvent(); { obj.doSomething(); verify(obj, times(1)).firedMyEvent(); } clearInvocations(obj); // org.mockito.Mockito.clearInvocations { obj.doSomething(); verify(obj, times(1)).firedMyEvent(); // OK }
clearInvocations
の引数はvarargsになっているので、第2、第3と引数へどんどん繋げていって一括リセットできる。