こんにちは、さるまりんです。
今回はテストについてです。
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)
と同じです。
複雑なロジックを組んで、実行時、必ず一度は呼ばれるものや、条件によって呼ばれたり、呼ばれなかったりをテストするのにこんな方法があって助かりました。
どこまでテストするかは哲学になってくるかもですが、テストはしっかりしないとですね。
読んでくださってありがとうございました。
それではまた!