Параметризованный тест Спока с использованием @WithMockUser

#unit-testing #groovy #annotations #spock

Вопрос:

Я хотел бы запустить параметризованный тест в Spock, используя @WithMockUser с другой ролью для каждой итерации.

В качестве примера, следующий тестовый код не показывает ошибки компиляции и запускается дважды. Но результат не получается, так как роль #разрешена только в аннотации @Unroll, но не в аннотации @WithMockUser.

     @Unroll("#role is authorized to get admin")
    @WithMockUser(username = "user", roles = ["#role"])
    def "User is authorized to get admin"() {
        when:
        def adminDto = adminController.getAdmin()

        then:
        adminDto.getStatusCode() == HttpStatus.OK

        where:
        role << ["USER", "ADMIN"]
    }
 

Поэтому мой вопрос таков: можно ли запустить такой тест как параметризованный?

Заранее благодарю вас!

Примечание: Я знаю, что аннотация может выглядеть так:

 @WithMockUser(username = "user", roles = ["USER", "ADMIN"])
 

но это было бы другое поведение — один вызов с обеими ролями.

Ответ №1:

Короткий ответ: нет.

Аннотации статически компилируются во время компиляции и не могут быть изменены Споком, итерации генерируются/оцениваются динамически во время выполнения. @Unroll Аннотация имеет некоторую специальную поддержку переменных данных, чтобы заставить ее работать, в то время как весенняя аннотация ничего не знает о Споке.

Вы можете посмотреть на WithMockUserSecurityContextFactory и использовать его, чтобы вручную установить значение SecurityContext в given блоке.