android - 如何在单元测试中初始化 ThreeTen Android backport

标签 android unit-testing threetenbp

我使用 this library用于在我的应用程序中存储日期和时间相关数据。当应用程序启动时,AndroidThreeTen 首先被初始化以正常运行。所以想问下单元测试的时候怎么初始化呢?例如。我想使用 LocalDateLocalDateTime 等进行测试

我现在的做法是这样的:

class OverviewViewModelTest {

    @Rule
    @JvmField
    val rule = InstantTaskExecutorRule()

    @Before
    fun setup() {
        AndroidThreeTen.init(Application())
    }

    //...
}

但是它抛出这个错误:

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)
    at org.threeten.bp.Clock.systemDefaultZone(Clock.java:137)
    at org.threeten.bp.LocalDate.now(LocalDate.java:165)
Caused by: java.lang.RuntimeException: Method getAssets in android.content.ContextWrapper not mocked. See http://g.co/androidstudio/not-mocked for details.
    at android.content.ContextWrapper.getAssets(ContextWrapper.java)
    at com.jakewharton.threetenabp.AssetsZoneRulesInitializer.initializeProviders(AssetsZoneRulesInitializer.java:22)
    at org.threeten.bp.zone.ZoneRulesInitializer.initialize(ZoneRulesInitializer.java:89)
    at org.threeten.bp.zone.ZoneRulesProvider.<clinit>(ZoneRulesProvider.java:82)
    ... 32 more

那么我怎样才能让这个库在单元测试中工作呢?

最佳答案

使用 latest comment at the GitHub issue ,我能够使用 Robolectric 库运行三个十个 Android backport。对于 Kotlin 用户,不要使用 final 类。相反,请使用 open 类。

在您应用的 build.gradle 中,添加:

dependencies {
    // ...
    testImplementation('org.threeten:threetenbp:1.3.8') {
        exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    }
}

并使用此模板使用 ThreeTenABP 编写测试:

@RunWith(RobolectricTestRunner::class)
open class DateUtilTest {

    @Test
    fun testName {
        // Write as normal
    }
}

关于android - 如何在单元测试中初始化 ThreeTen Android backport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54527311/

相关文章:

unit-testing - Uber Cadence 事件的单元测试上下文

python - python google-app-engine 网站的代码覆盖率?

java - 如何在 Android Studio 中忽略 java.time 包

java - ThreeTen-Backport 实现与 JSR-310 的向后移植?

android - BitmapHunter 异常 - 无法识别的请求类型

android - 要求解锁图案 - Android

unit-testing - 严格捕获用于单元测试的测试用例

android - 在 Android 中设置 >24 小时倒数计时器的最佳方法?

android - 在远程 VPS 上运行 Appium 和 Android 模拟器

android - 如何在不加载区域的情况下将 LocalDateTime 与 UTC 相互转换?