2018-10-30T08:47:00.000+09:00

Mockitoの`verify`カウント数をリセットする方法

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と引数へどんどん繋げていって一括リセットできる。