社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

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 が発生してしまう模様。