JUnit のモックは、org.mockito を使うことが多いのであろうか。
mockito-core と、mockito-inline を Maven pom.xml で依存関係を指定して使ったりする。
Mockito.when(~メソッド実行).thenReturn(リターン値);
などを良く書いていたものだ。
JMockito の書き方においては、テストコード内にモックメソッドのコードを、
mockit.MockUp アノテーションで作ったクラス内で、mockit.Mockのアノテーションで
テストケースに沿った振る舞いを書けるのが魅力的だ。。
(サンプル)
import org.junit.Assert; import org.junit.Before; import org.junit.Test; import mockit.Mock; import mockit.MockUp; import mockit.Mocked;
@Mocked private Foo foo; private int value; @Before public void before() { new MockUp<Foo>(){ @Mock public String execute() { String rtn; if (value==1) { rtn = "abc"; }else{ rtn = ""; } return rtn; } }; } @Test public void test() { value = 1; // value = 1 の時のテスト // Foo の execute() が実行される // @Inject private Foo foo; // を抱えるクラスの実行。 // TODO foo.execute() が実行されて最終的な結果を Assert する。 }
org.mockito を使ったり JMockito を使ったりなどの節操のないことは
さけるべきだが。。。
JMockito を使う時の Maven の pom.xml は以下で依存関係を記述
<dependency> <groupId>org.jmockit</groupId> <artifactId>jmockit</artifactId> <version>1.49</version> <scope>test</scope> </dependency>
このJMockito を実行する時に注意が必要なのは実行時に、jmockit-1.49.jar が必要で、
Ecllipse の通常のテスト実行では、
java.lang.IllegalStateException: JMockit didn't get initialized;
please check the -javaagent JVM initialization parameter was used
が発生してしまう。
実行するテストの実行時のJVM引数として、
-javaagent 引数=Javaプログラミング言語エージェントをロードする。
で、jmockit-1.49.jar を指定しなければならない。
こうなると、JMockito を使うのも躊躇してしまう。