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

15

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

public enum Month {
    January,
    February,
    ...
    December;
}

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

assertThat(Month.January, is(notNullValue()));

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

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

Edit:

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

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

assertThat(Month.valueOf("January"), is(notNullValue()));

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

Ваш Ответ

5   ответов
18

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

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

У меня есть enum, в котором есть один метод, который я хочу протестировать, я новичок в модульном тестировании и не могу найти способ написания тестовых примеров для этого метода. Можете ли вы дать мне пример или помочь в этом? . dirtydexter
If "assertThat (Month.January, is (notNullValue ()));" в вопросе ОП недостаточно примера для вас, я думаю, вам лучше задать его как отдельный вопрос и привести пример того, что вы пытаетесь проверить. Похоже, вам может понадобиться помощь с самой JUnit. aberrant80
Да, спасибо, большое. dirtydexter
8

Aberrant80.

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

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

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

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

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

public enum Multiplier {
    DOUBLE(2.0),
    TRIPLE(3.0);

    private final double multiplier;

    Multiplier(double multiplier) {
        this.multiplier = multiplier;
    }

    Double applyMultiplier(Double value) {
        return multiplier * value;
    }

}

public class MultiplierTest {

    @Test
    public void should() {
        assertThat(Multiplier.DOUBLE.applyMultiplier(1.0), is(2.0));
        assertThat(Multiplier.TRIPLE.applyMultiplier(1.0), is(3.0));
    }
}
У меня есть enum, в котором есть один метод, который я хочу протестировать, я новичок в модульном тестировании и не могу найти способ написания тестовых примеров для этого метода. Можете ли вы дать мне пример или помочь в этом? . dirtydexter
@ dirtydexter см. обновленный ответ с примером. Mike Rylander
4

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

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

3

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

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

есты @Unit не знают, как будут использоваться ваши месяцы, и еще меньше знают, как их можно использовать в будущем. Это означает, что вы должны включить для них модульные тесты, даже если приложение не будет компилироваться, если все месяцы отсутствуют. Предостережение: убедитесь, что ваши сложные объекты правильно охвачены модульными тестами, прежде чем беспокоиться о простых (например, перечисления без методов). Vince O'Sullivan
3

for(MyBoolean b : MyBoolean.values()) {
    switch(b) {
    case TRUE:
        break;
    case FALSE:
        break;
    default:
        throw new IllegalArgumentException(b.toString());
}

for(String s : new String[]{"TRUE", "FALSE" }) {
    MyBoolean.valueOf(s);
}

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

Похожие вопросы