1. Top
  2. Java Tips
  3. JUnit

単体試験ではシステム日時を簡単に変更する方法(JMockit)

単体テスト時に、こんなことよくありませんか?
1、テスト実行前にシステム日時を手動で変更する。
2、テストケースを実行する。
3、テスト終了後システム日時を元に戻す。
4、上記のことを返す…

いろいろな対処を調べて、JMockit などを使えば、システム日時プログラムで簡単変に変更することができます。


<注意>
・Java5の場合はVMオプションに-javaagent:jmockit.jarを付ける必要がある。
・JUnit4を使う場合バージョン4.5以降が必要がある。
詳しくは以下に説明があります。 Getting started with JMockit


JMockit.jar のダウンロードURLはこちらです。



JMockitを使ってCalendarクラスのモックを作成する

【モックカレンダークラス】
package test.com;

import java.util.Calendar;
import mockit.Mock;

/**
 * @author livetp.com
 */
public class MockCalendar {
    private static Calendar instance;
    
    public static void setInstance(Calendar desired) {
        instance = (Calendar)desired.clone();
    }
    
    public static void setSysDate(String ymd) {
        Calendar cal = Calendar.getInstance();
        
        if (ymd != null && ymd.length() == 8) {
            int yyyy = Integer.parseInt(ymd.substring(0,4));
            int MM = Integer.parseInt(ymd.substring(4,6));
            int dd = Integer.parseInt(ymd.substring(6,8));
            cal.set(yyyy,MM-1,dd);
        }
    
        instance = cal;
    }
    
    @Mock
    public static Calendar getInstance() {
        return (Calendar)instance.clone();
    }
}


ページの先頭へ

JMockitのJunitテストサンプル

概要: 1、モックカレンダーを使って、システム日時を20080101に設定する。 2、Calendarクラスのモックとして MockCalendar を指定する。 3、システム日時を取得して、確認する。
package test.sample;

import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.Calendar;
import mockit.Mockit;
import org.junit.Test;
import test.com.MockCalendar;

/**
 * @author livetp.com
 */
public class MockCalendarTest {
    
    @Test
    public void testPrivateMethod() {
        try {
            // 1、試験用システム日時を設定
            MockCalendar.setSysDate("20080101");
            
            // 2、Calendarクラスのモックとして MockCalendar を指定
            Mockit.setUpMock(Calendar.class, MockCalendar.class);
            
            // 3、試験を実施(システム日時を確認する)
            Calendar cal = Calendar.getInstance();
            assertEquals(2008, cal.get(Calendar.YEAR));
            assertEquals(01, cal.get(Calendar.MONTH+1));
            assertEquals(01, cal.get(Calendar.DATE));
        } catch (Exception e) {
            e.printStackTrace();
            fail();
        }
    }
}


ページの先頭へ