- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下应用程序代码。
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;
}
我用下面的内容为它写了一个单元测试。
@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);
出现以下错误
org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered
我试图通过使用来修复它
@Test
public 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)
请注意,我用于单元测试的 gradle 是
implementation 'com.jakewharton.threetenabp:threetenabp:1.1.1'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.19.0'
最佳答案
ThreeTen-Android Backport 向不支持 Java 8 的 Android 系统提供了 Java SE 8 日期时间类的反向移植。根据 android developer,此问题的原因是单元测试在 JVM 上运行,而不是在 Android 上运行。 :
Unit tests that run on your local machine only. These tests are compiled to run locally on the Java Virtual Machine (JVM) to minimize execution time. If your tests depend on objects in the Android framework, we recommend using Robolectric. For tests that depend on your own dependencies, use mock objects to emulate your dependencies' behavior.
Jake Wharton(ThreeTen-Android Backport 所有者)关于 Robolectric 不创建资源 has said :
This is a Robolectric bug. Either report to them or switch to use the normal ThreeTenBP in your unit tests. Or both!
因此,我们应该使用原始的 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);
}
结果:
关于java - 如何在不引发 org.threeten.bp.zone.ZoneRulesException 的情况下对使用 ZoneId.systemDefault 的代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53025980/
要获得一个 ZoneId 它是这样的: ZoneId.of("America/Sao_Paulo"); 或 ZoneId.of(ZoneId.SHORT_IDS.get("BET")); 为什么不存在
ZoneId.of("Australia/ACT").getRules().getOffset(LocalDateTime.of(2019, 03, 31, 13, 0, 0, 0)) 返回 +11:
通过 of("...") 方法获取 ZoneId 需要一个具有特定 ID 的字符串。可以使用 ZoneId.getAvailableZoneIds() 检索可用的 ID。这将返回(至少在我的系统和 J
本文整理了Java中java.time.ZoneId.from()方法的一些代码示例,展示了ZoneId.from()的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mav
本文整理了Java中java.time.ZoneId.of()方法的一些代码示例,展示了ZoneId.of()的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven等平
我有一个时区列表,我希望用户从中进行选择。所以,我认为我可以调用 java.time.ZoneId.getAvailableZoneIds() 并对它们使用方法 getDisplayName。这会导致
我现在正在巴黎运行这段代码,时间是 12:40,其中 ECT = ECT - Europe/Paris LocalDateTime creationDateTime = LocalDateTime.n
本文整理了Java中java.time.ZoneId.normalized()方法的一些代码示例,展示了ZoneId.normalized()的具体用法。这些代码示例主要来源于Github/Stack
本文整理了Java中java.time.ZoneId.ofOffset()方法的一些代码示例,展示了ZoneId.ofOffset()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.getDisplayName()方法的一些代码示例,展示了ZoneId.getDisplayName()的具体用法。这些代码示例主要来源于Gith
本文整理了Java中java.time.ZoneId.hashCode()方法的一些代码示例,展示了ZoneId.hashCode()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.toString()方法的一些代码示例,展示了ZoneId.toString()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.equals()方法的一些代码示例,展示了ZoneId.equals()的具体用法。这些代码示例主要来源于Github/Stackoverflow
本文整理了Java中java.time.ZoneId.getAvailableZoneIds()方法的一些代码示例,展示了ZoneId.getAvailableZoneIds()的具体用法。这些代码示
本文整理了Java中java.time.ZoneId.systemDefault()方法的一些代码示例,展示了ZoneId.systemDefault()的具体用法。这些代码示例主要来源于Github
本文整理了Java中java.time.ZoneId.getRules()方法的一些代码示例,展示了ZoneId.getRules()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.getId()方法的一些代码示例,展示了ZoneId.getId()的具体用法。这些代码示例主要来源于Github/Stackoverflow/M
本文整理了Java中org.threeten.bp.ZoneId.of()方法的一些代码示例,展示了ZoneId.of()的具体用法。这些代码示例主要来源于Github/Stackoverflow/M
我有一些代码可以从记录中读取短时区 ID 并将其传递给以下内容: ZoneId.of(ZoneId.SHORT_IDS.get(place.getTz())) 我无法控制使用什么时区 ID,但我的印象
我正在尝试使用 Java 的 ZoneId 和 ZoneOffsetTransitionRule 为 iCalendar VTIMEZONE 对象建模。 我的 VTIMEZONE 对象看起来像 BEG
我是一名优秀的程序员,十分优秀!