Подтвердить что ты не робот

Существует ли платформа модуляции Java, которая автоматически тестирует получатели и сеттеры?

В Java (и в других сообществах, я уверен) есть хорошо известные дебаты о том, следует ли тестировать тривиальные методы getter/setter. Обычно это касается покрытия кода. Согласитесь, что это открытая дискуссия, и не пытайтесь ответить на нее здесь.

Было несколько сообщений в блоге по использованию отражения Java для автоматического тестирования таких методов.

Предоставляет ли какая-либо инфраструктура (например, jUnit) такую ​​функцию? например Аннотации, в которых говорится, что "этот тест T должен автоматически проверять все геттеры/сеттеры класса C, потому что я утверждаю, что они стандартные".

Мне кажется, что он добавит ценность, и если бы он был настраиваемым, "дискуссия" осталась бы как опция для пользователя.

4b9b3361

Ответ 1

Unitils делает это с статическим методом assertRefEquals.

Ответ 2

Я не знаю ни одной доступной библиотеки или класса, которая делает это. Это может быть главным образом потому, что меня не волнует, поскольку я нахожусь на стороне решительного противодействия таким испытаниям. Поэтому, даже если вы спросили, что для этого представления должно быть немного оправдано:

Я сомневаюсь, что автотестирующие геттеры и сеттеры приносят пользу вашему качеству кода или вашему охвату: либо эти методы используются из другого кода (и проверены там, например, на 100% покрыты), либо вообще не используются (и могут быть удалены). В конце вы оставите геттеры и сеттеры, потому что они используются из теста, но нигде в приложении.

Это должно быть легко написать такой тест, например. с Apache Commons BeanUtils, но я сомневаюсь, что вам это действительно нужно, если у вас есть хорошие тесты.

Ответ 3

Я создал проект OpenPojo для решения этой точной проблемы.

Проект позволяет проверить:

  • Использовать стандарт кодирования Pojo (т.е. все поля приватные или нет встроенных переменных и т.д.)
  • Принудительное поведение Pojo (т.е. setter делает настройку JUST, без преобразования и т.д.)
  • Подтвердить идентификатор Pojo (т.е. использовать основанное на аннотации равенство и генерировать хэш-код)

См. учебное пособие

Ответ 4

В большинстве случаев setter и getter делают больше, чем установку и получение внутреннего поля. Объект должен проверять внутренние правила, чтобы он сохранял только допустимые значения. Например

  • Возможны ли нулевые значения?
  • Возможны пустые строки?
  • или отрицательные значения?
  • или нулевое значение?
  • или значения из списка действительны?
  • или есть максимальное значение?
  • или существует максимальная точность для значений BigDecimal?

unit test должен проверить правильность поведения, если имеются недопустимые значения. Это не может быть автоматизировано.

Если у вас нет логики для сеттера и получателя, он должен использоваться в любом месте вашего приложения. Напишите тест, где ваш объект является параметром для более сложного теста. Затем вы можете проверить его с помощью разных значений из списка.

Проверьте свою бизнес-логику, а не геттер и сеттер. Результат должен также охватывать геттер и сеттер. Эти методы также должны быть результатом вашей бизнес-логики, если у вас есть только публичная библиотека. Если у получателя и сеттера нет покрытия кода, удалите его.

Ответ 5

Я сделал что-то подобное. Простой класс java, который принимает объект и проверяет все методы getters и setter. http://sourceforge.net/projects/getterandsetter/

Я действительно думаю, что вам следует избегать методов getter и setter как можно больше, но пока они вокруг, и для проверки их требуется две строки, хорошо это сделать.

Ответ 6

Я одобряю дизайн OO поверх покрытия кода и вижу, не могу ли я перенести эти поля в класс, который им нужен. Поэтому я попытался бы увидеть, могут ли эти геттеры и сеттеры быть удалены, как это было предложено ранее. getters и seters нарушение инкапсуляции.

Ответ 7

Я пытаюсь открыть openpojo

Я пнул шины и, похоже, справился с этой задачей.

  • Он позволяет вам проверить все pojo в вашем проекте.
  • Кажется, проверяет лучшие практики в

Проверьте этот учебник для быстрого запуска Tutorial

Ответ 8

Я предполагаю, что эта библиотека является ответом на ваш вопрос

он тестирует все начальные значения bean, setters, getters, hashCode(), equals() and toString(). Все, что вам нужно сделать, это определить карту значения по умолчанию и свойства/значения по умолчанию.

Он также может тестировать объекты beans с дополнительными конструкторами, не использующими по умолчанию.

Ответ 9

Отвечая на предыдущий комментарий на @me здесь из-за моей репутации:

Vlookward, а не писать геттеры/сеттеры не имеет никакого смысла. Единственные опции для установки частных полей - это иметь явные сеттеры, устанавливать их в свой конструктор или устанавливать косвенно с помощью других методов (функционально откладывая сеттер в другое место). Почему бы не использовать сеттеры?

Ну, иногда, нет необходимости, чтобы поле было приватным (извините, если мой английский не очень хорош). Часто мы пишем наше программное обеспечение, поскольку оно является библиотекой, и мы инкапсулируем наши поля (поля нашей бизнес-логики) ненужными getters/seters.

В других случаях эти методы действительно необходимы. Тогда есть две возможности:
1. В них есть бизнес-логика. Затем они могут быть протестированы, но они не являются настоящими геттерами/сеттерами. Я всегда пишу эту логику в других классах. И тесты проверяют, что другие классы, а не POJO.
2. Нет. Тогда, не пишите их вручную, если можете. Например, реализация для следующего интерфейса может быть полностью автогенерирована (а также во время выполнения!):

interface NamedAndObservable {
  String getName();
  void setName(String name);
  void addPropertyChangeListener(PropertyChangeListener listener);
  void addPropertyChangeListener(String propertyName,
                                 PropertyChangeListener listener);
}

Итак, проверяйте только то, что написано вручную. Независимо от того, является ли это геттером/сеттер.

Ответ 10

Я не пишу тестовые примеры для каждого свойства, но вместо этого проверяю все сеттеры/геттеры в одном тестовом случае с использованием рефлексирования/интроспектора для определения типа (ов). Вот отличный ресурс, который показывает это:

http://www.nearinfinity.com/blogs/scott_leberknight/do_you_unit_test_getters.html