[英]Timestamp time mismatch because of the different time zone
我的團隊收到了一個新項目。 該項目有一堆沒有通過的測試。 用他們的話說,所有的測試都應該通過。 在調查問題后,我發現存在一個共同的問題。 大多數失敗的測試創建Timestamp
並使用它,但預期和實際日期不一樣。 差別只有一個小時。 舊的開發團隊一直在GMT + 1區域工作,我們的工作是GMT + 2。
為什么會這樣?
編輯 :
我有一個測試,它創建實體Rating
並設置一堆屬性。 例如:
rating.setValidFromDate(new Timestamp(1459841866798L));
然后測試斷言一個預期的String常量和rating.toString()
正如我所說,差異恰好是1小時
編輯2 :
@Test
public void testToString() {
Rating rating = new Rating();
rating.setValidFromDate(new Timestamp(1459841866798L));
assertEquals("Rating{validFromDate='2016-04-05 09:37:46'}", rating.toString());
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(Rating.class.getSimpleName());
builder.append("{");
builder.append("validFromDate='" + DateHelper.getStringFromDate(validFromDate) + "'");
builder.append("}");
return builder.toString();
}
public static String getStringFromDate(Date dateValue) {
String strDate = "";
if (dateValue != null) {
DateFormat dateFormat = new SimpleDateFormat(Constants.DATETIME_FORMAT);
strDate = dateFormat.format(dateValue);
}
return strDate;
}
我決定給你解決這個問題的方法。
閱讀本文后: java.sql.Timestamp:更改Timestamp的時區我找到了一種操作測試時區的方法。 所以我決定編寫一個JUnit規則來執行所有測試。
我寫了以下聲明:
public class GermanTimeZoneStatement extends Statement {
private final Statement base;
public GermanTimeZoneStatement(Statement base) {
super();
this.base = base;
}
@Override
public void evaluate() throws Throwable {
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
base.evaluate();
}
}
之后我寫了這條規則:
public class GermanTimeZoneRule implements TestRule {
public static GermanTimeZoneRule getInstance() {
return new GermanTimeZoneRule();
}
@Override
public Statement apply(Statement base, Description description) {
return new GermanTimeZoneStatement(base);
}
}
最后,我在我的測試中包含了這樣的規則,如下所示:
@Rule
public GermanTimeZoneRule germanTimeZoneRule = GermanTimeZoneRule.getInstance();
您正在測試的代碼與時區有關。 它根據用戶默認時區中的時間輸出特定日期。 這就是為什么它為你的同事提供不同的輸出。
您需要返回該代碼的規范,並檢查這是否是預期的行為。 如果是,則需要修改測試以考慮時區。 如果這不是預期的行為,那么恭喜你,你的測試暴露了一個錯誤!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.