Как проверить типы перечислений?
================================

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

Здесь я хочу убедиться, что все типы перечислений действительно существуют. Это даже необходимо? В настоящее время я использую Hamcrests`assertThat` как в следующем примере:

Пропавший "январь" enum приведет к ошибке времени компиляции, которую можно исправить, создав недостающий тип enum.

Я здесь использую Java, но не возражаю, если вы ответите на другом языке.

**Edit:**

Как mkato, так и Mark Heath оба указали, что тестирование перечислений может быть необязательным, поскольку компилятор не будет компилироваться, когда вы используете тип enum, которого там нет. Но я все еще хочу протестировать эти перечисления, так как мы хотим создать отдельный TCK-подобный test.jar, который будет запускать один и тот же тест в разных реализациях. Таким образом, мой вопрос должен был звучать так: как лучше всего проверить типы перечислений?

Подумав об этом немного больше, я изменил приведенное выше утверждение Hamcrest:

Это утверждение теперь бросает NPE, когда января еще нет (пока). Что-то не так с этим подходом?

 когда в них есть методы. Если это просто перечисление только для значений, как в вашем примере, я бы сказал, не беспокойтесь.

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



 

 Если кто-то удаляет или добавляет значение, некоторые из тестов не пройдены.



 [Aberrant80](https://stackoverflow.com/questions/1079700/how-to-test-enum-types/1103800#1103800).

 Для перечислений я проверяю их только тогда, когда в них есть методы. Если это просто перечисление только для значений, как в вашем примере, я бы сказал, не беспокойтесь.

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

 Я бы остановился на этом, добавив, что юнит-тестирование Enum может быть очень полезным. Если вы работаете с большой базой кода, время сборки начинает увеличиваться, и модульное тестирование может быть более быстрым способом проверки функциональности (тесты только строят свои зависимости). Другое действительно большое преимущество заключается в том, что другие разработчики не могут непреднамеренно изменить функциональность вашего кода (огромная проблема с очень большими командами).

 И со всей разработкой, управляемой тестами, тесты с использованием методов Enums уменьшают количество ошибок в вашей кодовой базе.

 **Простой пример**



 ваша IDE не позволит вам скомпилировать, поэтому я думаю, что вам не нужно модульное тестирование.

 Но если вы используете их с отражением, даже если вы удалите один месяц, он скомпилируется, поэтому допустимо поставить модульный тест.



 что это излишне, но иногда есть причины писать юнит-тесты для перечислений.

 Иногда значения, назначенные элементам перечисления, никогда не должны изменяться, иначе загрузка устаревших сохраненных данных не удастся. Точно так же, очевидно, неиспользованные члены не должны быть удалены. Модульные тесты могут использоваться для защиты от изменений, вносимых разработчиком, не осознавая последствий.