我正在使用Robolectric gradle测试运行器为Android代码编写单元测试。我正在测试的代码碰巧使用以下格式的日期格式化方法:
yyyy-MM-dd'T'HH:mm:ss.SSSZ
我们将Unix Time毫秒存储为该格式的字符串,并且在通过格式化程序将其转换回毫秒偏移量之前,我们替换" 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被抛出在从prod代码中成功解析的日期保存的字符串中。
什么可能导致这种行为的根本差异?
我已经尝试过的事情:
- 检查日期格式
- 这个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。也就是说,不完全互补的操作在生产中运行良好,但在单元测试中失败。
答案 0 :(得分:1)
尝试直接为单元测试设置字符串:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#32c6a6"
android:weightSum="1">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/besked"
android:layout_weight="0.70"
android:textSize="20dp"
android:layout_marginTop="30dp"
android:textIsSelectable="true"
android:textColor="#000000"
android:background="#ffffff"
android:gravity="top"
android:paddingTop="30dp"
android:hint="Hvis du har feedback eller nogle spørgsmål, så er du velkommen til at skrive. Vi besvarer mailen hurtigst muligt"
android:scrollIndicators="right"/>
<Button
android:layout_width="144dp"
android:layout_height="wrap_content"
android:text="Send"
android:id="@+id/sendknap"
android:layout_gravity="center_horizontal"
android:layout_weight="0.05"
android:textSize="20dp"/>
</LinearLayout>
运行Robolectric时遇到了同样的问题。根据GitHub上的这个issue,将String validDateString = "2016-02-20T19:47:33.262+0000"; // remove the colon
替换为+00:00
可以解决我的问题。