我正在使用 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/