仅在单元测试期间出现 DateFormat ParseException
DateFormat ParseException only during unit testing
我正在使用 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。我首先假设这是因为我注入的日期字符串存在格式问题,但是 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 时遇到了同样的问题。根据 GitHub 上的 issue,用 +0000
替换 +00:00
解决了我的问题。
我正在使用 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。我首先假设这是因为我注入的日期字符串存在格式问题,但是 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 时遇到了同样的问题。根据 GitHub 上的 issue,用 +0000
替换 +00:00
解决了我的问题。