Mockito 引数に応じて返す値を変化させる(Java モック)
テスト(モック)対象のクラス
誕生月のクラス。
誕生石を返却するメソッドも持っているが、誕生石を保持するためのクラス変数はない。
誕生月を引数にしているが、必ず null が返却されるようになっている。
public class BirthMonth { private int month; public BirthMonth(int month) { this.month = month; } public int getMonth() { return month; } public String getBirthStone(int month) { return null; } }
テストコード(JUnit)
public class BirthMonthTest { # モックなし @Test public void testGetBirthStoneWithoutMock() { BirthMonth birthMonth = new BirthMonth(2); assertThat(birthMonth.getBirthStone(2), is(nullValue())); assertThat(birthMonth.getBirthStone(7), is(nullValue())); assertThat(birthMonth.getBirthStone(11), is(nullValue())); } # モックあり @Test public void testGetBirthStoneWithMock() { BirthMonth birthMonth = mock(BirthMonth.class); when(birthMonth.getBirthStone(anyInt())).thenReturn("not found"); when(birthMonth.getBirthStone(2)).thenReturn("amethyst"); when(birthMonth.getBirthStone(7)).thenReturn("ruby"); when(birthMonth.getBirthStone(11)).thenReturn("topaz"); assertThat(birthMonth.getBirthStone(5), is("not found")); assertThat(birthMonth.getBirthStone(2), is("amethyst")); assertThat(birthMonth.getBirthStone(7), is("ruby")); assertThat(birthMonth.getBirthStone(11), is("topaz")); assertThat(birthMonth.getBirthStone(20), is("not found")); } }
モックなしの場合、getBirthStone() の引数にどんな値を与えても、null が返却される。
モックありの場合、getBirthStone() の引数に与える引数に応じて、返却する値を定義することが出来る。
所感
anyInt() など、anyXXX でデフォルト値を設定してあげることができるイメージ。
ただし、anyXXX は最初に定義してあげないと、java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch が発生してしまう模様。