技術空間

JMockit

JMockitの導入&サンプルプログラム


TOP > JMockit > JMockitの導入&サンプルプログラム



■JMockitとは

■JMockitの導入

公式サイト(http://jmockit.org/)から下記のjarをダウンロードする。

取得したjarファイルをJUnitのjarよりも先にクラスパスへ通す

Eclipseの場合

■サンプル実行
サンプルプログラム

まずはテスト対象クラスを2本ほど作成する。

1つは現在日付をyyyy/MM/dd形式で取得するクラス(MyCalendar.java)。

MyCalendar.java
package test;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class MyCalendar {

    /** 現在日をyyyy/MM/dd形式で取得 */
    public String getToday() {
        Calendar cal = Calendar.getInstance();
        return new SimpleDateFormat("yyyy/MM/dd").format((cal.getTime()));
    }
}

もう1つは上記で作成したクラスを使用して、今日が12月かどうかを判定するクラス(Sample.java)。

Sample.java
package test;

public class Sample {

    /** 現在日が12月か判定 */
    public boolean isDecember() {

        MyCalendar myCal = new MyCalendar();
        String month = myCal.getToday().split("/")[1];

        if("12".equals(month)){
            return true;
        }
        return false;
    }
}

次にSampleクラスのisDecember()をテストするクラスを作成する。(SampleTest.java

モックを使わないでテストすると、テスト実施日によってMyCalendarのgetToday()の値が変わってしまうため、テストが成功したり失敗したりする(継続的なテストもできない)。 しかし、モックを使うことによって常に同じ状態でテストを行うことができる。

SampleTest.java
package test;

import static org.junit.Assert.*;

import org.junit.Test;

import mockit.Expectations;
import mockit.Mocked;

public class SampleTest {

    // ①モックにする変数にアノテーション付加
    @Mocked
    private MyCalendar myCal;
    
    @Test
    public void testIsDecember() {

        // ②モックにしたクラスの挙動を記述
        new Expectations() {{
            myCal.getToday();
            result = "2015/12/01";  // 1回目に呼ばれたときに返す値
            result = "2015/08/15";  // 2回目に呼ばれたときに返す値
        }};

        Sample sample = new Sample();
        assertTrue(sample.isDecember());  // ③現在日が"2015/12/01"になるためtrue
        assertFalse(sample.isDecember()); // ④現在日が"2015/08/15"になるためfalse
    }
}

[説明]


①モックにする変数にアノテーション付加

モックオブジェクトにする変数に@Mockedアノテーションをつける。

@Mocked
private MyCalendar myCal;

②モックにしたクラスの挙動を記述

new Expectations()に挙動を変更したいメソッドと戻り値(result)を記述する。戻り値を列挙すると、メソッドが呼ばれる度に返却される値が変わる。

new Expectations() {{
    myCal.getToday();
    result = "2015/12/01";
    result = "2015/08/15";
}};

③1回目に呼ばれたときはgetToday()が"2015/12/01"を戻すため、結果がtrueになる。

assertTrue(sample.isDecember());

④2回目に呼ばれたときはgetToday()が"2015/08/15"を戻すため、結果がfalseになる。

assertFalse(sample.isDecember());


TOP > JMockit

Tweet ̃Gg[͂ĂȃubN}[Nɒlj
技術空間