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 の方がシンプルに書けて良いなと思います。