可測試的系統時間

執行單元測試時,與系統時間相依的測試是個麻煩,但應該解決的問題。 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());
}

results matching ""

    No results matching ""