#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
блоке.