|
Модераторы: LSD |
|
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 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. |
|||
|
||||
Старовъръ |
|
|||
Опытный Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 2 Всего: 10 |
Можно или использовать какие-то свои утилитные классы что-то вроде такого, создавать в продакшн коде обычный, а в тестах подменять на моковый, а можно просто выносить статику в другой метод этого же класса, делать его package-private и создавать spy(), в котором подменять этот метод в SUT.
Оба способа предусматривают, что скорей всего видимость какого-то члена класса будет минимум package-private и он будет открыт скорей всего только для тестов, но это небольшой trade-off за тестируемость. К тому же такой член класса можно пометить как @VisibleForTesting (взять из guava или написать свою документирующую аннотацию). -------------------- |
|||
|
||||
Stolzen |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 2 Всего: 48 |
Первое, что приходит в голову - вынести получение времени в отдельную зависимость и мокать ее (как и написал Старовъръ)
А второе - это использовать PowerMock, он статику позволяет мокать. Как именно он это делает, я не знаю, ни разу не пользовался, обычно первым способом обхожусь. |
|||
|
||||
LSD |
|
||||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 1 Всего: 537 |
Вот именно этого и хотелось бы избежать уж больно код уж больно enterprise style получается
Это как раз то что нужно. -------------------- 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. |
||||
|
|||||
Старовъръ |
|
|||
Опытный Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 2 Всего: 10 |
PowerMock в нелегаси системах, наверно, не лучший выбор. Если интересно все-таки легковесное решение, то лучше все-таки выделить отдельный метод в классе типа getTime() и сделать Mockito.spy(sut) и дальше замокать его.
Это сообщение отредактировал(а) Старовъръ - 11.5.2012, 16:57 -------------------- |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 1 Всего: 537 |
Почему? -------------------- 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. |
|||
|
||||
Старовъръ |
|
|||
Опытный Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 2 Всего: 10 |
-------------------- |
|||
|
||||
Stolzen |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 2 Всего: 48 |
Вот и наткнулся самолично на описанные грабли - при использовании PowerMock JaCoCo/EclEmma не могут получать данные о тестовом покрытии из-за вмешательств первого в байт-код классов. Проблему решил запуском этих тестов через Cobertura, но осадочек остался.
|
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 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. |
|||
|
||||
powerOn |
|
|||
software saboteur Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
а я бы лучше выбрал тайм провайдер. Использовать power mock значит создавать прецедент, по которму он сможет применяться для аналогичных случаев (мокать не мокируемое), где на самом деле нужен рефакторинг. Да и в литературе советуют создавать "анти-коррупционный" слой, если API платформы уныл - а такое не редкость. Вот тут: http://www.growing-object-oriented-software.com/ пример с датами как раз разбирают в одной из глав.
|
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Design, Quality, Testing | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |