Mockitoを使ってメソッドが呼ばれた回数をテストする方法

こんにちは、さるまりんです。

今回はテストについてです。

Mockitoを使ってテストしている時にあるメソッドが呼ばれたかをテストしたいことがありました。

サンプルで見てみます。

こんなクラスがあります。 (class A)

public class A {
    public void methodA(int n) {
        ....
    }
}

次のロジックでは、numが1以上であればmethodA()がよばれますが、それ以外であれば

int num = ○;
A a = new A();

if (num > 0) {
    a.methodA(num);
}

numが1と仮定すると、methodA()は1回よばれます。

これが正しいかは次のようなコードでテストします。

// aはクラスAのモックオブジェクトです。
A a = Mockito.mock(A.class):

// int値をとるオブジェクトaのメソッドmethodA()は1回よばれる
verify(a, times(1)).methodA(anyInt());

times()で呼ばれる回数を指定しています。

ちょっとロジックを変えます。

if (num >= 0) {
    a.methodA(num);
    if (num == 0) {
        a.methodA(num);
    }
}

このロジックではnumが0であれば、methodA()は2回よばれます。

これが正しいかは次のようなコードでテストします。

// int値をとるオブジェクトaのメソッドmethodA()は1回よばれる
verify(a, times(2)).methodA(anyInt());

まとめるとこんな感じです。

verify([モックオブジェクト], times([回数])).[テストするメソッド]([引数]);

回数をテストする他のメソッド

times()以外にも回数を指定するメソッドがあります。

atLeastOnce()

最低でも1回呼ばれるかをテストします。

verify(a, atLeastOnce()).methodA(anyInt());

atLeast(int i)

最低でもi回呼ばれるかをテストします。

verify(a, atLeastOnce()).methodA(anyInt());

atLeast(1)atLeastOnce()と同じです。

atMost(int i)

こちらは逆で最高でi回呼ばれるかをテストします。

verify(a, atMost(2)).methodA(anyInt());

最高で2回なので、3回呼ばれるとエラーとなります。

never()

こちらはメソッドが呼ばれないことをテストします。

verify(a, never()).methodA(anyInt());

never()times(0)と同じです。

複雑なロジックを組んで、実行時、必ず一度は呼ばれるものや、条件によって呼ばれたり、呼ばれなかったりをテストするのにこんな方法があって助かりました。

どこまでテストするかは哲学になってくるかもですが、テストはしっかりしないとですね。

読んでくださってありがとうございました。

それではまた!