android - 仅在单元测试期间出现 DateFormat ParseException

标签 android unit-testing simpledateformat robolectric

我正在使用 Robolectric gradle 测试运行器为 Android 代码编写单元测试。我正在测试的代码恰好是使用以下格式的日期格式化方法:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

我们将 Unix 时间毫秒存储为该格式的字符串,就在通过格式化程序将其发送以将其转换回毫秒偏移量之前,我们将字符串中的任何“Z”实例替换为“+00:00”。调用最终看起来像这样:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
format.parse(validDateString.replace("Z", "+00:00));

此操作在生产代码中运行良好,但尝试编写单元测试时发现了以前未见过的 ParseExceptions。我首先假设这是因为我注入(inject)的日期字符串存在格式问题,但是在产品代码中成功解析的日期保存的字符串上抛出了 ParseExceptions。

可能是什么导致了这种根本的行为差异?

我已经尝试过的事情:

-检查日期格式

——这个DateFormat其实是一个全局静态变量。我知道它们不是线程安全的,但使用新实例内联所有静态引用会产生相同的结果。

更新: 部分堆栈跟踪

java.text.ParseException: Unparseable date: "2016-02-20T19:47:33.262+00:00"
at java.text.DateFormat.parse(DateFormat.java:357)
...nothing else useful

另外,我要提一下,我们使用了一种补充方法,将毫秒存储为字符串:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date date = new Date(unixTime);
String validDateString = format.format(date);
return validDateString.replace("+0000", "Z");

请注意,我们要替换 4 个不带冒号的 0,而失败的方法会附加 00:00。也就是说,不太互补的操作在生产中运行良好,但在单元测试中失败。

最佳答案

尝试直接为单元测试设置字符串:

String validDateString = "2016-02-20T19:47:33.262+0000"; // remove the colon

我在运行 Robolectric 时遇到了同样的问题。根据这个issue在 GitHub 上,将 +00:00 替换为 +0000 为我解决了这个问题。

关于android - 仅在单元测试期间出现 DateFormat ParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35139588/

相关文章:

java - 将日期从 "2009-12 Dec"格式转换为 "31-DEC-2009"

java - SimpleDateFormat 在 Android 和 JDK 中产生不同的时区输出

Android NDK 安装 TARGETS 给定可执行目标没有 RUNTIME DESTINATION

java - 实例变量的 setter 和 getter 的 Junit 测试

angular - 使用 Karma Angular 进行快照测试而不是开玩笑

返回 NULL 的 PHPUnit stub 方法?

android - 如何解决通过上下文传递的类的警报对话框泄漏?

java - 不在android中的可绘制 Canvas 中显示横幅广告

android - 如何以编程方式设置 Android ProgressBar 的大小?

java - SimpleDateFormat.parse - ParseException