2016-01-08 52 views
0

我正在嘗試爲某個類編寫測試用例。我想將測試用戶的年齡設置爲一定的值,但我不想處理年齡計算和/或使junit測試用例具有時間獨立性,我知道該如何去感謝@SkinnyJ earlier post基於年齡的Joda-Time設置日期對象

那麼,有沒有辦法做這樣的事情:老

LocalDate birthday = new LocalDate(72Y3M); 

72年3個月是用戶期望的時代。然後,喬達時間將採取這個數字,並計算他/她的生日應該是那個年齡,並返回該日期。所以在這種情況下,生日是October 8, 1943

嘗試1:

public LocalDate setUsersAge(int years, int months, int days) { 
    LocalDate birthday = new LocalDate(); 
    birthday.minusYears(years); 
    birthday.minusMonths(months); 
    birthday.minusDays(days); 

    return birthday 
} 

嘗試2:

public LocalDate setUsersAge(int years, int months, int days) { 
    Period age = new Period(); 
    age.withYears(years); 
    age.withMonths(months); 
    age.withDays(days); 

    return birthday.minus(age); 
} 

雖然兩者的方式完成工作,我只是不喜歡代碼的樣子。有沒有更乾淨的方法來做到這一點?

回答

2

我認爲這是實現你的目標的一個非常乾淨的方式:

public LocalDate setUsersAge(int years, int months, int days) { 
    return LocalDate.now().minusYears(years).minusMonths(months).minusDays(days); 
} 

編輯:感謝來自羅勒布爾克的評論,如果你擔心用的timeZone問題,你可以做以下:

public LocalDate setUsersAge(int years, int months, int days, DateTimeZone timeZone) { 
     return LocalDate.now(timeZone).minusYears(years).minusMonths(months).minusDays(days); 
} 
+1

很好的答案,但請注意,時區對確定今天的日期至關重要。該代碼隱含地依賴於JVM當前的默認時區。即使在運行期間,該默認設置也可以隨時更改。我建議明確,將期望/期望的時區傳遞給「now」方法的調用。 –

+0

@BasilBourque感謝您的評論。你當然是對的。我總是在生產代碼中傳遞時區,但我認爲這些都是單元測試,它們都將在同一個JVM上完成。但是,最好是安全而不是抱歉:) –