[英]Static Utility Class, Unit Testing and Java.Time
由於我們的客戶仍在使用 Java.Date.Util,我們不得不處理各種轉換方法和大型臃腫的日期實用程序 class。 我的目標是簡化實用程序 class 並為其編寫單元測試。
我已經設法簡化它,但我遇到了測試用例的問題,因為:
以下是我需要為其編寫測試用例的一些方法示例:
/**
* Get the current time in any format.
* @param outFormat
* @return
*/
public static Object getNow(TimeFormat outFormat){
Instant dateObject = Instant.now();
return new InstantConverter().convertTo(dateObject, outFormat);
}
/**
* @param value - unit of time
* @param unit - hours, days, etc. Anything higher than days is not supported.
* @param format - format returned.
*/
public static Object calculateFutureDate(int value, ChronoUnit unit, TimeFormat outFormat) {
Instant time = Instant.now().plus(value, unit);
return new InstantConverter().convertTo(time, outFormat);
}
InstantConverter是一個受保護的 class,它將 Instant 轉換為各種時間輸出(本地日期、字符串、紀元、java.util.date 等),而TimeFormat是一個枚舉,包含我們可以轉換的所有格式。
我知道在單元測試方面遠離 static 方法是最佳實踐……但恐怕這不是一個選擇。
在我的研究中,似乎我唯一的選擇是使用 powermock 或 mockito 的更高版本之一來模擬我的 static instant.now() 方法(類似於:Z5E056C500A1C4B6A7110B50D807BADE5 mockito-java-kotlin/ )。
我只是想確保我沒有遺漏任何明顯的東西,因為我犯了一個錯誤,我不想再次重構。
感謝任何花時間閱讀本文的人。 如果您有任何問題,請告訴我。
沒有什么可以阻止您將Clock
注入包含 static 實用程序方法的 class 中。
private static Clock
字段(一個 class 變量)。 在聲明中將其初始化為Clock.systemUTC()
或Clock.systemDefaultZone()
。Clock
。inject
或setClock
方法將Clock
注入 static 變量。uninject
方法將Clock
設置回其初始值。 將您的單元測試保持在相同的 package 中,以便他們可以使用 package 私有注入方法。 您可能已經知道,測試 static 實用程序方法的測試方法首先注入其所需的Clock
,然后調用該方法進行測試並驗證該方法的返回值。 由於Clock
為 static,因此無法並行運行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.