@WithMockUser считывает значение из статического перечисления или строки

#spring #spring-boot #spring-security #enums #mockito

Вопрос:

Внутри аннотации @WithMockUser я хотел бы прочитать значения из постоянных перечислений или строковых переменных и списков.

Например, давайте предположим, что у меня есть перечисление, подобное следующему:

 public enum RoleEnum {
    ROLE_ADMIN
    ROLE_MODERATOR,
    ROLE_USER;

    public static final String[] X_ROLE_GROUP = {ROLE_ADMIN.name(), ROLE_MODERATOR.name()};
}
 

Я хотел бы использовать @WithMockUser путем преобразования значений перечисления в строку, подобную этой, но следующий синтаксис не работает:

 @WithMockUser(roles = RoleEnum.ROLE_ADMIN.name())
@Test
public void test {
    ...
}
 

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

Ответ №1:

Ну, roles приставка не нужна ROLE_ , пока authorities есть. Значения аннотаций должны быть константами времени компиляции. Вы можете попробовать это:

 @Test
@WithMockUser(roles = Role.ROLE_ADMIN)
void test() {
}

public static final class Role {
    public static final String ROLE_ADMIN = "ADMIN";
    public static final String ROLE_MODERATOR = "MODERATOR";
    public static final String ROLE_USER = "USER";

    private Role() {
    }

    public static final String[] X_ROLE_GROUP = {
            ROLE_ADMIN,
            ROLE_MODERATOR
    };
}
 

Или, если вам нужен смешанный стиль (другие классы могут реализовать наследование констант), попробуйте:

 public interface Role {
    String ROLE_ADMIN = "ADMIN";
    String ROLE_MODERATOR = "MODERATOR";
    String ROLE_USER = "USER";

    String[] X_ROLE_GROUP = {
            ROLE_ADMIN,
            ROLE_MODERATOR
    };
}