Я пишу модульные тесты для Android-кода с помощью Robolectric gradle test runner. Код я тестирование, случается, ударяя методы форматирования даты, которые используют следующий формат:DateFormat ParseException только во время модульного тестирования
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.
Что может быть причиной такого радикального различия в поведении?
Вещи я уже пробовал:
-Checked дата форматирования
-Этот DateFormat на самом деле является глобальной статической переменной. Я знаю, что они не являются потокобезопасными, но вложение всех статических ссылок с новыми экземплярами дает те же результаты.
UPDATE: Частичное трассировки стека
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. Тем не менее, не совсем комплементарные операции прекрасно работают на производстве, но не проходят единичные тесты.
Можете ли вы опубликовать полное исключение? Радикальная разница в том, что Robolectric тесты работают на JVM, а не на Dalvik/ART. –
Это тоже мое подозрение. Через несколько минут я отредактирую свой пост. – Chris
Извините за нелепую задержку, я обновил вопрос с помощью трассировки стека и некоторой дополнительной информации. – Chris