Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Design, Quality, Testing > тестирование класса с аннотированными методами


Автор: nmn 16.9.2011, 01:49
Здравствуйте

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

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

Код

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


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

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

Спаситееее

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

Автор: nmn 16.9.2011, 10:35
Цитата(Старовъръ @ 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 и они независимо друг от друга тестируются

Автор: Старовъръ 16.9.2011, 11:37
Ну как ни крути, ты тестирушь слишком много в одном тесте. Тестируй метод в одном тесте, а обработку самой аннотации - в другом тесте.
То, что Мокито не клонирует объекты - это логично, тогда бы он требовал, чтоб передаваемые объекты реализовывали Clonneable или что-то вроде того.

Автор: nmn 16.9.2011, 12:40
вобщем я выкрутился с использованием дополнительного интерфейса, из которого делается мок при помощи mockito. Этот интерфейс записывает клонированные аргументы методов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)