第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java、TDD 不等于時為真?

Java、TDD 不等于時為真?

有只小跳蛙 2023-10-19 21:28:18
由于某種原因,在課堂上測試此方法時,我們發(fā)現了一個我們無法理解的問題。當出于某種原因寫作時System.out.println();它就過去了?有人可以解釋為什么會發(fā)生這種情況嗎?public class Zones {public ZoneId getZoneId(String input) {    if (input.equalsIgnoreCase("Stockholm")) {        return ZoneId.of("Europe/Stockholm");    }    else if (input.equalsIgnoreCase("Shanghai")) {        return ZoneId.of("Asia/Shanghai");    } else if (input.equalsIgnoreCase("Toronto")) {        return ZoneId.of("America/Toronto");    }    else if (input.equalsIgnoreCase("Hamburg")) {        return ZoneId.of("Europe/Berlin");    }    else return null;}public LocalDateTime getZoneTime(ZoneId zoneId) {    LocalDateTime lt = LocalDateTime.now(zoneId);    return lt;}}private Zones z = new Zones();@Testpublic void getZoneTimeTest () {    System.out.println(z.getZoneTime(zIDToronto).getNano() );    System.out.println(LocalDateTime.now(zIDToronto).getNano() );    assertTrue(z.getZoneTime(zIDToronto).getNano() == LocalDateTime.now(zIDToronto).getNano());}
查看完整描述

2 回答

?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

終于有時間更深入地研究這個問題了。


我開始實驗,過了一段時間后發(fā)現,實際上并不是System.out.println它的存在影響了結果,而是你LocalDateTime在它之前實例化了2個實例。


深入挖掘LocalDateTime和SystemClock(它所委托的) 的代碼,我發(fā)現亞毫級精度是通過調用本機調用 來實現的jdk.internal.misc.VM#getNanoTimeAdjustment。


最后一個調用是特定于操作系統(tǒng)的。我對它進行了一些實驗,發(fā)現它不會線性返回值,因為它在循環(huán)中被調用(假設我的循環(huán)運行得相當規(guī)律)。


所以我決定運行一些代碼來映射返回的納米值。


我制作了這個示例代碼:


Clock clock = Clock.systemDefaultZone();


int samples = 1_000;

LocalDateTime[] instants = new LocalDateTime[samples];


int k = 0;


for (int i = 0; i < samples; i++) {

    instants[i] = LocalDateTime.now(clock);

    for (int j = 0; j < 10000; j++) {

        k = j % 2;

    }

}

將值寫入文件,然后將納米差異與第一個值映射到圖表中:

https://img1.sycdn.imooc.com/65312f3100016cf506440441.jpg

正如您所看到的,該圖(包含 1000 個值)會出現間歇性跳躍。這顯然部分是由于底層系統(tǒng)的精度限制造成的。但令我震驚的是,前兩個值始終不同。就好像在定期訪問時操作系統(tǒng)開始緩存該值一段時間(可能是為了避免系統(tǒng)資源緊張)。

但結果似乎是您設置自己在第三次和第四次調用時獲得相同的值(除非已經過去了足夠的時間)。

這可以解釋為什么您的測試在沒有這些先前實例的情況下通過,而失敗。

順便說一句,對于單元測試,您不想依賴系統(tǒng)時鐘。確保您的業(yè)務代碼從注入的 Clock 實例獲取時間。然后,您可以注入自定義時鐘進行測試,并測試您的代碼是否會在 DST 轉換日期或閏日運行,而無需等待幾個月。


查看完整回答
反對 回復 2023-10-19
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

該測試涉及競爭條件并通過(有時),因為時間和添加語句會改變時間并因此改變測試結果。

斷言中檢查的條件基本上是連續(xù)兩個日期時間的納秒部分是否相等。

鑒于默認情況下由System.currentTimeMillis()內部使用并且它最多具有毫秒精度,如果獲取納秒數的第二個調用序列足夠快(即導致在同一時間內完成調用的LocalDateTime.now實際調用序列),則檢查將成功。System.currentTimeMillis毫秒作為第一個)。

當您在實際斷言之前調用用于獲取納秒值的函數時,會加載相應的類,相應方法的代碼會進入 CPU 緩存等。這使得第二對獲取納秒數的調用運行得更快。


查看完整回答
反對 回復 2023-10-19
  • 2 回答
  • 0 關注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號