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); のように、”○○メソッドが呼ばれた時、××を返却する” と直感的に書けるところが分かり易い。
クラス概略図