亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何在不引發 org.threeten.bp.zone.ZoneRulesException

如何在不引發 org.threeten.bp.zone.ZoneRulesException

慕田峪7331174 2021-12-10 16:48:33
我有以下應用程序代碼。應用代碼public static long advanceByMax1HourWithoutOverflow(long currentTimeMillis) {    ZoneId zoneId = ZoneId.systemDefault();    ZonedDateTime zonedDateTime = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId);    // 0-23    int hour = zonedDateTime.getHour();    if (hour < 23) {        zonedDateTime = zonedDateTime.plusHours(1);        return zonedDateTime.toInstant().toEpochMilli();    }    // 0-59    int minute = zonedDateTime.getMinute();    if (minute < 59) {        zonedDateTime = zonedDateTime.plusMinutes(1);        return zonedDateTime.toInstant().toEpochMilli();    }    return currentTimeMillis;}我用以下內容為它編寫了一個單元測試。單元測試代碼@Testpublic void advanceByMax1HourWithoutOverflow() {    /*    27 October 2018    1540648800000 -> 1540652400000    22:00 -> 23:00    */    long currentTimeMillis = 1540648800000L;    long expected = 1540652400000L;    long output = Utils.advanceByMax1HourWithoutOverflow(currentTimeMillis);    assertEquals(expected, output);我收到以下錯誤org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered我試圖通過使用來修復它單元測試代碼@Testpublic void advanceByMax1HourWithoutOverflow() {    Context context = mock(Context.class);    AndroidThreeTen.init(context);    /*    27 October 2018    1540648800000 -> 1540652400000    22:00 -> 23:00    */    long currentTimeMillis = 1540648800000L;    long expected = 1540652400000L;    long output = Utils.advanceByMax1HourWithoutOverflow(currentTimeMillis);    assertEquals(expected, output);我越來越java.lang.ExceptionInInitializerError    at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)    at org.threeten.bp.ZoneId.of(ZoneId.java:358)    at org.threeten.bp.ZoneId.of(ZoneId.java:286)    at org.threeten.bp.ZoneId.systemDefault(ZoneId.java:245)有什么方法可以通過單元測試,而無需更改當前應用程序的方法簽名?我只想保留我當前的應用程序方法簽名而不做任何修改。long advanceByMax1HourWithoutOverflow(long currentTimeMillis)
查看完整描述

1 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

ThreeTen-Android Backport 向不支持 Java 8 的 Android 系統提供了 Java SE 8 日期時間類的向后移植。 這個問題的原因是單元測試在 JVM 上運行,而不是 Android開發者所說的:


僅在本地計算機上運行的單元測試。這些測試被編譯為在 Java 虛擬機 (JVM) 上本地運行,以最大限度地減少執行時間。如果您的測試依賴于 Android 框架中的對象,我們建議使用 Robolectric。對于依賴于您自己的依賴項的測試,請使用模擬對象來模擬您的依賴項的行為。


Jake Wharton(ThreeTen-Android Backport 所有者)關于沒有通過 Robolectric 建立資源說:


這是一個 Robolectric 錯誤。要么向他們報告,要么切換到在單元測試中使用普通的 ThreeTenBP?;騼烧?!


因此,我們應該使用原始 ThreeTen Backport 庫來解決這個問題。所以我們應該將它的依賴添加到build.gradle單元測試要使用的文件中。


在 build.gradle 文件中:


dependencies {


    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.1'


    testImplementation ('org.threeten:threetenbp:1.3.2'){

        exclude group:'com.jakewharton.threetenabp', module:'threetenabp'

    }

}

在單元測試類中:


@Test

public void advanceByMax1HourWithoutOverflow() {

    /*

    27 October 2018

    1540648800000 -> 1540652400000

    22:00 -> 23:00

    */

    long currentTimeMillis = 1540648800000L;

    long expected = 1540652400000L;

    long output = Utils.advanceByMax1HourWithoutOverflow(currentTimeMillis);

    assertEquals(expected, output);

}

結果:

http://img1.sycdn.imooc.com//61b3148400016f8106630180.jpg

查看完整回答
反對 回復 2021-12-10
  • 1 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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