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

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

JMockito 一部のメソッドのみをモック化する(Java モック)

これの JMockito 版です。
blueskyarea.hatenablog.com

モック化するクラス
public class PointCard {
	
	public PointCard() {
	}
	
	public String getMemberName() {
		return "hoge";
	}
	
	public long getPoint() {
		return 1000L;
	}
}
テスト対象のクラス
public class Member {
	private PointCard pointCard;
	
	public Member() {
		this.pointCard = new PointCard();
	}

	public String getMemberNameAndPoint() {
		return pointCard.getMemberName() + "_" + pointCard.getPoint();
	}
}
テスト
@RunWith(JMockit.class)
public class MemberTest {
	@Test
	public void testGetPointIsMocked() {
	    new NonStrictExpectations(PointCard.class) {  // 1
                {
                    new PointCard().getPoint();  // 2
                    result = 7777L;  // 3
                }
            };
            Member member = new Member();
            assertThat(member.getMemberNameAndPoint(), is("hoge_7777"));  // 4
	}
}

1. Expectations(NonStrictExpectations) のコンストラクタに、モック化するクラスの Class オブジェクトを渡す。
2. モック化したいメソッドを記述する。
3. そのモックの振る舞いを記述する。
4. 結果を評価する。
今回、PointCard クラスのメソッドにおいて、
getMemberName() はモック化していないため、"hoge" がそのまま返却される。
getPoint() はモック化していて、7777 を返却するように定義しているため、7777 が返却される。
よって結果は、"hoge_7777" となる。

これをもし、以下のように書いた場合、

@RunWith(JMockit.class)
public class MemberTest {
	@Test
	public void testGetPointIsMocked(@Mocked PointCard pointCard) {
	    new NonStrictExpectations() {
                {
            	    pointCard.getPoint();
                    result = 7777L;
                }
            };
            Member member = new Member();
            assertThat(member.getMemberNameAndPoint(), is("hoge_7777"));
	}
}

getMemberName() もモック化されてしまう。
そして振る舞いを定義していないので、null が返却される。
よって結果は、"null_7777" となる。

所感

Mockito で同じことを実現したいときは、@Spy や @InjectMocks を定義してあげる必要がありました。
JMockito では特別なアノテーションも必要ないので、これに関しては、JMockito の方がシンプルに書けて良いなと思います。