Как добавить модульный тест для enum в spock?

У меня ниже класс enum

public enum EmployeeType {

    PERMANENT("10"),
    TEMPORARY("20"),
    PART_TIME("30");

    private final String employeeTypeId;

    EmployeeType(final String employeeTypeId) {
        this.employeeTypeId = employeeTypeId;
    }

    public String getEmployeeTypeId() {
        return employeeTypeId;
    }
}

Попытка с приведенной ниже спецификацией

class EmployeeTypeSpec extends Specification {
    
    @Unroll
    def "validate emp type"(EmployeeType employeeType) {
        expect:
        // want to assert each employeeType name() and employeeTypeId here
        employeeType.name()
        employeeType.employeeTypeId

        where:
        employeeType << EmployeeType.values()
    }
}

Здесь я передаю каждое значение перечисления, используя метод values(). но не знаете, как утвердить имя и employeeTypeId для каждого перечисления?

«Хотите утвердить каждое имя employeeType () и employeeTypeId здесь» — какое утверждение вы хотели бы сделать о каждом из них?

Jeff Scott Brown 21.11.2022 15:39

EmployeeType.name() == 'PERMANENT' employeeType.employeeTypeId == '10', вот так я хочу утверждать каждый служащий

Remo 21.11.2022 16:00

Почему вы хотите протестировать name()?

Jeff Scott Brown 21.11.2022 16:02

Не конкретно имя (). хотите подтвердить каждое свойство каждого перечисления

Remo 21.11.2022 16:04

Я бы не стал использовать .value() в блоке where для тестирования того, о чем вы говорите. Я бы, наверное, написал тест как EmployeeType.PERMANENT. employeeTypeId == '10' и т. д.

Jeff Scott Brown 21.11.2022 16:05

Получил вашу точку зрения. вместо этого EmployeeType.PERMANENT. employeeTypeId == '10', я пытаюсь найти решение с блоком where для проверки каждого значения перечисления

Remo 21.11.2022 16:11

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

Jeff Scott Brown 21.11.2022 16:16
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то вроде этого, вероятно, будет иметь больше смысла, чем employeeType << EmployeeType.values():

def "Test enum values"() {
    expect:
    value.employeeTypeId == typeId

    where:
    // could have more columns here if the enum
    // had more properties...
    value                  | typeId
    EmployeeType.PERMANENT | '10'
    EmployeeType.TEMPORARY | '20'
    EmployeeType.PART_TIME | '30'
}

На самом деле это не относится к будущим модификациям, т. е. не гарантирует охват новых случаев.

user16358266 22.11.2022 17:38

"это не гарантирует охват новых случаев" - Вы правы. Это гарантирует, что typeId имеет ожидаемое значение. Если бы перечисление имело другие свойства, их можно было бы опросить.

Jeff Scott Brown 22.11.2022 18:09

Просто хотел отметить, что тест OPs также обнаружит новые значения перечисления, поскольку он использует EmployeeType.values(). Таким образом, вы можете либо сделать канареечный тест, который просто проверяет, что размер перечисления все еще является ожидаемым 3. В качестве альтернативы вы можете использовать [value, typeId] << [EmployeeType.values(), ['10', '20', '30']].transpose(), при условии, что таблица данных читается лучше, но это начнет давать сбой, если новое значение перечисления было добавлено без обновления теста.

user16358266 23.11.2022 13:53

«Хотел отметить, что тест OP также обнаружит новые значения перечисления, поскольку он использует EmployeeType.values ​​()» — верно, но нет полезных общих утверждений, которые можно сделать о новых значениях перечисления без повторного посещения теста. . Если вы предпочитаете использовать подход .values() и он более прост для вас, сделайте это. Я бы не стал.

Jeff Scott Brown 23.11.2022 18:41

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

user16358266 24.11.2022 11:04

Другие вопросы по теме