可測試的系統時間
執行單元測試時,與系統時間相依的測試是個麻煩,但應該解決的問題。 UDE 建議所有程式都透過Now類別取得系統時間,如此便可透過UDE測試套件設定測試系統時間。
取得目前的日期/時間
Now可回傳的類別型態包含
- JDK8的
- LocalDate、
- LocalDateTime、
- Instant、
- ZonedDateTime,其中Zoned採系統預設時區;
- JDK7以前
- java.lang.Date、
- java.sql.Timestamp;
- UDE自訂的RocDateTime類型。
目前民國日期/時間
Now.rocDateTime()、Now.rocDateTime(String datePattern, String timePattern),回傳 RocDateTime 物件,便於取得目前系統時間的民國年月日格式字串,預設是7碼日期/6碼時間。
單元測試
在JUNIT中,定義@Rule public SystemTimer systemTimer時指定時間,即可對同一TEST CLASS中的所有測試項目,在執行前調整NOW提供的系統時間,執行後還原。 若宣告systemTimer時未指定,也可在個別測試METHOD前,加上@TestTime以設定時間。
// 在JUNIT單元測試中,定義TEST-RULE : SystemTimer
@Rule
public SystemTimer systemTimer = new SystemTimer("2013/01/02 03:04:05"); // 或 = new SystemTimer();
@Test
public final void testSetup_0() {
final Instant nowInstant = Now.instant();
final Date nowDate = Now.date();
final Timestamp nowTimestamp = Now.timestamp();
final RocDateTime rocDateTime = Now.rocDateTime();
Assert.assertEquals("1020102", rocDateTime.toDateString());
Assert.assertEquals("030405", rocDateTime.toTimeString());
}
@Test
@TestTime("2014/02/03 04:05:06")
public final void testSetup_1() {
final RocDateTime rocDateTime = Now.rocDateTime();
Assert.assertEquals("1030203", rocDateTime.toDateString());
Assert.assertEquals("040506", rocDateTime.toTimeString());
}