JMockito を使う場合の注意

JUnit のモックは、org.mockito を使うことが多いのであろうか。
mockito-core と、mockito-inlineMaven 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 を使うのも躊躇してしまう。