概要
Mockitoでテストしていると、時々同一メソッドを複数回コールしているが、渡される引数が決まっているような状況があります。
その時に
- AだったらC
- BだったらD
のようにしたい、と
下記のメソッドを使います。
Matchers.eq
もうちょっと具体的なところへ落とし込む
とあるメソッドへ渡される引数が3つあるとし、そのうちの1つはEnum値で何が渡されるかはある程度決まっているようなケース
SampleEnum.java
public enum SampleEnum {
CASE_A,
CASE_B,
CASE_C;
}
Sample.java
public class Sample {
public String branch(String argStr, int argNum, SampleEnum sampleEnum) {
String retStr = "";
switch (sampleEnum) {
case CASE_A:
retStr = "CASE_A:" + argStr + argNum;
break;
case CASE_B:
retStr = "CASE_B:" + argStr + argNum;
break;
case CASE_C:
retStr = "CASE_C:" + argStr + argNum;
break;
default:
break;
}
return retStr;
}
}
以下がテスト。
SampleTest.java
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
public class SampleTest {
@Test
public void test() {
Sample testTarget = new Sample();
Sample spyTestTarget = spy(testTarget);
doReturn("TEST_A").when(spyTestTarget).branch(anyString(), anyInt(),
eq(SampleEnum.CASE_A));
String result = spyTestTarget.branch("test", 2, SampleEnum.CASE_A);
assertThat(result, is("TEST_A"));
result = spyTestTarget.branch("test", 2, SampleEnum.CASE_B);
assertThat(result, is("CASE_B:test2"));
}
}
まとめ
上記のdoReturn("TEST_A").when(spyTestTarget).branch(anyString(), anyInt(),eq(SampleEnum.CASE_A));
で、Enum値を狙い撃ってリターン値を想定通りにすることができます。
Enum値がSampleEnum.CASE_A
以外が渡されると本来の処理が行われていることも確認できます。
特定のケースの時に値を変更しておきたいテストをする時とかに便利です。