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

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

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

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

Mockito 版の記事と同じクラスをテスト対象にしました。

テストコード(JUnit)
import mockit.Expectations;
import mockit.Mocked;
import mockit.integration.junit4.JMockit;

@RunWith(JMockit.class)
public class MemberTest {	
	// Without mock
	@Test
	public void testGetMemberInfoWithoutMock() {
		Member member = new Member(1, "hoge");
		assertThat(member.getPointCard().getPoint(), is(1000L));
	}
	
	// With Mock
	@Test
	public void testGetMemberInfoWithMock(@Mocked Member member) {
	    PointCard pointCard = new PointCard(1, "hoge", 2000L);
	    new Expectations() {
            {
                member.getPointCard();
                result = pointCard;
            }
        };
            assertThat(member.getPointCard(), is(pointCard));
	    assertThat(pointCard.getPoint(), is(2000L));
	}
}

@RunWith(JMockit.class) アノテーションを付けないと、エラーで怒られました。

java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath (if using JUnit; if not, check the documentation)

classpath 内において、jmockit.jar を junit.jar よりも先に定義しておく必要があるみたいです。
自分の環境下で上手く出来なかったため、代わりにこのアノテーションで回避してます。

結果

Mockito と同様のモックを生成することが出来ました。
Mockito では期待する動作を when().thenReturn() で定義していましたが、JMockito では Expectations で定義します。
この程度の内容であれば Mockito とどちらが使いやすいか検討するまでの違いは見当たりません。

Mockito と JMockito 名前は非常に似ていますが、モックの書き方は全く異なるので、プロジェクト単位でどちらかを使うかは決めた方が良さそうです。
「モックの作り方」についてネットの検索結果をそのまま適用していると、いつの間にか混在しているみたいなこともありそうです。