Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Юнит тесты календаря 
V
    Опции темы
LSD
Дата 10.5.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 1
Всего: 537



Есть класс который реализует некоторую логику по работе с календарем. Вся логика по работе с датами инкапсулирована в этом классе. Возник вопрос, как тестировать функциональность в разные моменты времени, т.е. грубо говоря надо подменить результат System.currentTimeMillis(). Можно конечно сделать в классе кастомный метод getTime() и в тестах подменять результат его работы, но выглядит как-то криво. Может есть более другие методы?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Старовъръ
Дата 10.5.2012, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 2
Всего: 10



Можно или использовать какие-то свои утилитные классы что-то вроде такого, создавать в продакшн коде обычный, а в тестах подменять на моковый, а можно просто выносить статику в другой метод этого же класса, делать его package-private и создавать spy(), в котором подменять этот метод в SUT. 
Оба способа предусматривают, что скорей всего видимость какого-то члена класса будет минимум package-private и он будет открыт скорей всего только для тестов, но это небольшой trade-off за тестируемость. К тому же такой член класса можно пометить как @VisibleForTesting (взять из guava или написать свою документирующую аннотацию).
PM MAIL WWW   Вверх
Stolzen
Дата 10.5.2012, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 2
Всего: 48



Первое, что приходит в голову - вынести получение времени в отдельную зависимость и мокать ее (как и написал Старовъръ)
А второе - это использовать PowerMock, он статику позволяет мокать. Как именно он это делает, я не знаю, ни разу не пользовался, обычно первым способом обхожусь.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 10.5.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 1
Всего: 537



Цитата(Старовъръ @  10.5.2012,  14:36 Найти цитируемый пост)
Можно или использовать какие-то свои утилитные классы что-то вроде такого, создавать в продакшн коде обычный, а в тестах подменять на моковый

Вот именно этого и хотелось бы избежать уж больно код уж больно enterprise style получается smile


Цитата(Stolzen @  10.5.2012,  14:52 Найти цитируемый пост)
А второе - это использовать PowerMock, он статику позволяет мокать.

Это как раз то что нужно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Старовъръ
Дата 11.5.2012, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 2
Всего: 10



PowerMock в нелегаси системах, наверно, не лучший выбор. Если интересно все-таки легковесное решение, то лучше все-таки выделить отдельный метод в классе типа getTime() и сделать Mockito.spy(sut) и дальше замокать его.

Это сообщение отредактировал(а) Старовъръ - 11.5.2012, 16:57
PM MAIL WWW   Вверх
LSD
Дата 11.5.2012, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 1
Всего: 537



Цитата(Старовъръ @  11.5.2012,  17:56 Найти цитируемый пост)
PowerMock в нелегаси системах, наверно, не лучший выбор.

Почему?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Старовъръ
Дата 13.5.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 2
Всего: 10



  • Тяжеловесный инструмент для такой мелочи, его основная ниша - legacy code. 
  • Придется описывать всякие @RunWith(PowerMock..), что не позволит использовать другие раннеры в JUnit.
  • Он не так тривиален, бывают косяки, которых совсем не ожидаешь - например, он использует свой собственный ClassLoader, у нас не так давно была проблема из-за этого (уже не помню конкретные случаи, коллега тест писал, не я), еще проблемы были что каким-то магическим образом он не очищал состояние мока между тестами (тоже не конкретно я сталкивался, к сожалению).

PM MAIL WWW   Вверх
Stolzen
Дата 22.6.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 2
Всего: 48



Вот и наткнулся самолично на описанные грабли - при использовании PowerMock JaCoCo/EclEmma не могут получать данные о тестовом покрытии из-за вмешательств первого в байт-код классов. Проблему решил запуском этих тестов через Cobertura, но осадочек остался.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 12.7.2012, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 1
Всего: 537



У нас PowerMock прекрасно работает, и не пришлось извращаться с time provider.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 28.8.2012, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



а я бы лучше выбрал тайм провайдер. Использовать power mock значит создавать прецедент, по которму он сможет применяться для аналогичных случаев (мокать не мокируемое), где на самом деле нужен рефакторинг. Да и в литературе советуют создавать "анти-коррупционный" слой, если API платформы уныл - а такое не редкость. Вот тут: http://www.growing-object-oriented-software.com/ пример с датами как раз разбирают в одной из глав.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Design, Quality, Testing | Следующая тема »


 




[ Время генерации скрипта: 0.1613 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.