参数化 @WithMockUser Spring 启动

Parametrize @WithMockUser Spring boot

我正在尝试使用 @WithMockUser 模拟身份验证来测试我的控制器的方法安全性。

关键是在我的应用程序中有 3 个角色(我们称它们为 Role_1、Role_2 和 Role_3),我想测试它们 分别.

现在,我必须编写 3 个不同的测试来实现这个目的,如下所示:

@Test
@WithMockUser(roles = ["1"])
fun `Role 1 should receive 403 Status code`(){
    val url = "$debtorsPath/"
    this.mockMvc
        .perform(get("/url/"))
        .andExpect(status().isUnauthorized)
}

@Test
@WithMockUser(roles = ["2"])
fun `Role 2 should receive 403 Status code`(){
    this.mockMvc
        .perform(get("/url/"))
        .andExpect(status().isUnauthorized)
}

@Test
@WithMockUser(roles = ["3"])
fun `Role 3 should receive 200 Status code`(){
    this.mockMvc
        .perform(get("/url/"))
        .andExpect(status().isOk)
}

但我想对角色 1,2 进行参数化,因为它们是完全相同的测试。这样我就会有这样的东西:

@Test
@ParameterizedRoles(values = ["1", "2"])
fun `Roles 1 & 2 should receive 403 Status code`(){
    val url = "$debtorsPath/"
    this.mockMvc
        .perform(get("/url/"))
        .andExpect(status().isUnauthorized)
}

跳过 @WithMockUser 并通过 SecurityMockMvcRequestPostProcessors.user("myUser").roles("ADMIN").
以编程方式为您的请求设置角色 然后您可以像这样参数化您的测试:

fun runAndAssert(user: String, role: String, statusMatcher: ResultMatcher){
    this.mockMvc
        .perform(get("/url/").with(user(user).roles(role)))
        .andExpect(statusMatcher)
}