読者です 読者をやめる 読者になる 読者になる

現在日付を含めたコードのテスト

こんなレガシーコードがありました。現在日付がちゃんと設定されているかテストしたいんですがどうしたもんか…
テストコード書きやがれ。

import java.util.Date;
public class Hoge {
    // テスト対象
    public HogeBean execute() {
        HogeBean bean = new HogeBean();
        bean.setDate(DateUtil.getCurrentDate());
        return bean;
    }
    public class HogeBean {
        private Date date;
        public Date getDate() {
            return date;
        }
        public void setDate(Date date) {
            this.date = date;
        }
    }
}

DateUtilクラス

import java.util.Date;
public class DateUtil {
    public static Date getCurrentDate() {
        return new Date();
    }
}

Javassistを使って解決したのですが、なんか違う気がする…
DateUtilクラスをインターフェース化するとEasyMockで楽になるのにな。
テストコード

import static org.junit.Assert.assertEquals;

import java.util.Calendar;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

import org.junit.Before;
import org.junit.Test;

public class HogeTest {
    private Hoge tester;
    private Calendar cal;

    @Before
    public void setup() {
        tester = new Hoge();
        cal = Calendar.getInstance();
        cal.clear();
        cal.set(2013, Calendar.JANUARY, 1);
    }

    @Test
    public void test() throws Exception {
        setCurrentDate();
        Hoge.HogeBean bean = tester.execute();
        assertEquals(cal.getTime(), bean.getDate());
    }

    private void setCurrentDate() throws Exception {
        ClassPool cp = ClassPool.getDefault();
        CtClass cc = cp.get("test.DateUtil");
        CtMethod cm = cc.getDeclaredMethod("getCurrentDate");
        cm.setBody("{ "
                + "java.util.Calendar cal = java.util.Calendar.getInstance();"
                + "cal.clear();"
                + "cal.set(2013, java.util.Calendar.JANUARY, 1);"
                + "return cal.getTime();" + " }");
        cc.toClass();
    }
}