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

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

Mockito あるメソッドが任意の値を返す(Java モック)

何も特別なことはありません。最近、色んなモックライブラリを混同してしまっているので、復習を込めて確認しています。

テスト(モック)対象のクラス

仮に以下のようなクラス(Member)があった場合、getPointCard() の返り値(PointCard オブジェクト)を任意にしたい。

public class Member {
	private int id;
	private String name;
	private PointCard pointCard;
	
	public Member(int id, String name) {
		this.id = id;
		this.name = name;
		this.pointCard = new PointCard(id, name, 1000);
	}
	
	public PointCard getPointCard() {
		return pointCard;
	}
}
public class PointCard {
	private int cardNumber;
	private String memberName;
	private long point;
	
	public PointCard(int cardNumber, String memberName, long point) {
		this.cardNumber = cardNumber;
		this.memberName = memberName;
		this.point = point;
	}
	
	public int getCardNumber() {
		return cardNumber;
	}
	
	public String getMemberName() {
		return memberName;
	}
	
	public long getPoint() {
		return point;
	}
}

テストコード(JUnit)

public class MemberTest {
        # モックなし
	@Test
	public void testGetMemberInfoWithoutMock() {
		Member member = new Member(1, "hoge");
		assertThat(member.getPointCard().getPoint(), is(1000L));
	}
	
        # モックあり
	@Test
	public void testGetMemberInfoWithMock() {
		Member member = mock(Member.class);
		PointCard pointCard = new PointCard(1, "hoge", 2000L);
		
		when(member.getPointCard()).thenReturn(pointCard);
		
		assertThat(member.getPointCard(), is(pointCard));
		assertThat(pointCard.getPoint(), is(2000L));
	}
}

モックなしの場合、Member クラスのコンストラクタにて、point = 1000 で生成された PointCard のオブジェクトがそのまま返却される。
モックありの場合、返却する PoinrCard のインスタンスがテストコード内で改めて生成(point = 2000 にて)されており、その新たに生成されたオブジェクトが返却される。

所感

when(member.getPointCard()).thenReturn(pointCard); のように、”○○メソッドが呼ばれた時、××を返却する” と直感的に書けるところが分かり易い。

クラス概略図

f:id:blueskyarea:20180607234854p:plain