JMockitを使用してみる その2

先日、Expectationsを使ったMockのレコーディングで
コンストラクタの処理がMockできないということを書きました。
JMockitを使用してみる - nemuzukaの「明日から本気出す」

いろいろいじってたらできましたー。

@MockField(methods={"doSomething"})

@MockField(methods={"<init>","doSomething"})

にするか、

@MockField

でよかったみたいです。ふぅ。
で、動作確認の為にサンプルクラスを作成しました。


Mock対象クラス Dependency

package jp.co.nemuzuka;

import java.util.Date;

public class Dependency {


    /**
     * コンストラクタ.
     */
    public Dependency() {
        throw new RuntimeException("だめだー");
    }

    /**
     * コンストラクタ.
     */
    public Dependency(String string) {
        throw new RuntimeException("やだ");
    }

    /**
     * コンストラクタ.
     */
    public Dependency(Date param) {
        throw new RuntimeException("作らせん!");
    }

    /**
     * Mock対象メソッド.
     */
    public String getData(String data, String data2) {
        return "引数は" + data + "と" + data2 + "ですね";
    }

}

どのコンストラクタを使用してもExceptionがthrowされるにくい奴です。


で、テストクラス TargetExpectationsTest

package jp.co.nemuzuka;

import java.util.Date;

import mockit.Expectations;
import mockit.MockField;

import org.junit.After;
import org.junit.Test;

import static mockit.Mockit.tearDownMocks;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

public class TargetExpectationsTest {

    @After
    public void tearDown() {
        tearDownMocks();
    }

    @Test
    public void testCase1() {

        //Expectationsを使用して操作を記録
        new Expectations(true) {
            @MockField
            Dependency mockDependency;
            {
                //最初の呼び出し用のMockの振る舞い
                new Dependency();
                mockDependency.getData("","");
                returns("Dependency#Dependency()をMock");

                //次の呼び出し用のMockの振る舞い
                //※withNotNullはnullでなければ何でも良い
                new Dependency((Date) withNotNull());
                mockDependency.getData((String) withNotNull(), (String) withNotNull());
                returns("Dependency#Dependency(Date)をMock");

                //次の呼び出し用のMockの振る舞い
                new Dependency("おほほー");
                mockDependency.getData((String) withNotNull(), (String) withNotNull());
                returns("Dependency#Dependency(String)をMock");

            }
        };


        //テスト対象クラスのインスタンスを生成(引数無しのコンストラクタ)
        Dependency target = new Dependency();
        assertThat(target.getData("",""), is("Dependency#Dependency()をMock"));

        //テスト対象クラスのインスタンスを生成(引数Dateのコンストラクタ)
        target = new Dependency(new Date());
        assertThat(target.getData("ひげ","abc"), is("Dependency#Dependency(Date)をMock"));

        //テスト対象クラスのインスタンスを生成(引数Dateのコンストラクタ)
        target = new Dependency("おほほー");
        assertThat(target.getData("hige","あいう"), is("Dependency#Dependency(String)をMock"));
    }
}


インスタンスが生成できないのに、テストできちゃいました。
(JVMの引数におまじないとして -javaagent:jmockit.jar が必要です)


うん、楽チン。