仅在单元测试期间使用DateFormat ParseException

时间:2016-02-01 20:21:53

标签: android unit-testing simpledateformat robolectric

我正在使用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。也就是说,不完全互补的操作在生产中运行良好,但在单元测试中失败。

1 个答案:

答案 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可以解决我的问题。