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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тестирование класса с аннотированными методами 
V
    Опции темы
nmn
Дата 16.9.2011, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте

Есть некий класс у которого присутствуют методы с аннотациями. Эти аннотации используются в рантайме и определяют поведение класса.

Столкнулся со следующей проблемой, easymock при создании мока класса не учитывает аннотации у методов, в новом динамически созданном классе присутствуют необходимые методы, но отсутствуют у них аннотации. В связи с этим ничего не работает :(

Код

Mtc to = createMockBuilder(Mtc.class).withConstructor().createNiceMock();


посоветовали мне использовать mockito, мол крутой фреймворк. Там действительно аннтоации сохраняются в новом созданном классе моке. Но вылезла противная проблема: мокито не сохраняет копии переданных аргументов, а только ссылки на них. Это очень ужасно, потому что в отличии от изимоков верификация вызвовов происходит _после_ выполнения тестируемого кода, а за это время аргументы меняются и как результат тестируемый класс отрабатывает правильно, но верификация не проходит. Вот тут обсуждение этой проблемы: http://code.google.com/p/mockito/issues/detail?id=126 , как то она зависла.

Я сейчас в растерянности, не вижу способа заставить изимоки сохранять аннотации. А используя мокито не хочется городить дополнительный код для ручного сохранения изменяемый параметров, да и не всегда это возможно (например если метод final).

Спаситееее
PM Skype   Вверх
Старовъръ
Дата 16.9.2011, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Cудя по тому, что запосчено по той ссылке, твой тест тестирует сразу несколько методов, что не очень правильно. Один тест должен концентрироваться на выполнении одного метода, если он и дергает другие, то только для подготовки SUT. Если ты отрефакторишь тест именно так, то проблемы с List'ом исчезнут.
PM MAIL WWW   Вверх
nmn
Дата 16.9.2011, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Старовъръ @ 16.9.2011,  08:51)
Cудя по тому, что запосчено по той ссылке, твой тест тестирует сразу несколько методов, что не очень правильно. Один тест должен концентрироваться на выполнении одного метода, если он и дергает другие, то только для подготовки SUT. Если ты отрефакторишь тест именно так, то проблемы с List'ом исчезнут.

То не мой тест. То иллюстрация проблемы с аргументами в мокито.

Подробнее расскажу что происходит

Код

interface@ CallMe {
.... // разные параметры определяющие когда метод должен вызываться
}

class BaseClass {
...// вспомогательные методы для вызова аннотированных методов
}


class Descendant extends BaseClass {

@CallMe(...)
public void handler(... /*передается изменяемый параметр*/) {
...//полезная работа
}
}



Мне надо протестировать как вызывается мой аннотированный метод, какие параметры передавались при вызове этого метода. Да другие методы тоже вызываются, но они как бы вне поле зрения и не интересуют меня.

фактически я тестирую Descendant, создаю в нем несколько методов и проверяю как они вызываются

Добавлено через 12 минут и 56 секунд
может нужно вынести каждый @CallMe метод в отдельный класс? Т.е. есть 5 разных условий вызова, каждое нужно протестировать, создается 5 классов наследников от BaseClass и они независимо друг от друга тестируются
PM Skype   Вверх
Старовъръ
Дата 16.9.2011, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну как ни крути, ты тестирушь слишком много в одном тесте. Тестируй метод в одном тесте, а обработку самой аннотации - в другом тесте.
То, что Мокито не клонирует объекты - это логично, тогда бы он требовал, чтоб передаваемые объекты реализовывали Clonneable или что-то вроде того.
PM MAIL WWW   Вверх
nmn
Дата 16.9.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


 




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


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

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