こんなレガシーコードがありました。現在日付がちゃんと設定されているかテストしたいんですがどうしたもんか…
テストコード書きやがれ。
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(); } }