2016-02-01 4 views
2

Я пишу модульные тесты для 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. Тем не менее, не совсем комплементарные операции прекрасно работают на производстве, но не проходят единичные тесты.

+0

Можете ли вы опубликовать полное исключение? Радикальная разница в том, что Robolectric тесты работают на JVM, а не на Dalvik/ART. –

+0

Это тоже мое подозрение. Через несколько минут я отредактирую свой пост. – Chris

+0

Извините за нелепую задержку, я обновил вопрос с помощью трассировки стека и некоторой дополнительной информации. – Chris

ответ

1

Попробуйте настроить строку для модульного тестирования непосредственно:

String validDateString = "2016-02-20T19:47:33.262+0000"; // remove the colon 

Я была такая же проблема при работе Robolectric. В соответствии с этим issue на GitHub, заменив +00:00 на +0000, проблема была решена для меня.