如何在单元测试中初始化 ThreeTen Android backport
How to initialize ThreeTen Android backport in a Unit test
我使用 this library 在我的应用程序中存储日期和时间相关数据。当应用程序启动时,AndroidThreeTen
首先被初始化以正常运行。所以想问下单元测试的时候怎么初始化呢?例如。我想使用 LocalDate
、LocalDateTime
等进行测试
我现在的方式是这样的:
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 向后移植。对于 Kotlin 用户,不要使用最后的 class。相反,使用 open class.
在您应用的 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
}
}
我使用 this library 在我的应用程序中存储日期和时间相关数据。当应用程序启动时,AndroidThreeTen
首先被初始化以正常运行。所以想问下单元测试的时候怎么初始化呢?例如。我想使用 LocalDate
、LocalDateTime
等进行测试
我现在的方式是这样的:
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 向后移植。对于 Kotlin 用户,不要使用最后的 class。相反,使用 open class.
在您应用的 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
}
}