Spring Security 在一个测试方法中是否可能有超过1个@WithMockUser?

6ojccjat  于 2023-08-05  发布在  Spring
关注(0)|答案(1)|浏览(92)

我正在使用Sping Boot + Spring Security + Junit 5,最新版本。
在一个测试方法中,我是否可以使用两个@WithMockUser()?所以测试方法运行两次,每次都使用不同的@WithMockUser信息?例如,我有

@WithMockUser(username="admin",roles={"USER","ADMIN"})
@WithMockUser(username="user" ,roles={"USER","ADMIN"})
public void test1() {}

字符串
等于运行两次。例如:

@WithMockUser(username="admin",roles={"USER","ADMIN"})
public void test1() {}


和/或

@WithMockUser(username="user" ,roles={"USER","ADMIN"})
public void test1() {}


Java源代码解决方案

lb3vh1jj

lb3vh1jj1#

您可以使用UserRequestPostProcessor配置MockMvc请求,以实现@WithMockUser的等效行为。
结合Junit5的参数化测试,您可以执行以下操作:

import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.junit.jupiter.params.provider.Arguments.of;

@ParameterizedTest
@MethodSource("withMockUser")
void someTest(String username, String[] roles) throws Exception {

    mockMvc.perform(get("/foo")         
           .with(user(username).roles(roles)))
           .......
}

private static Stream<Arguments> withMockUser() {
    return Stream.of(
            of("admin", new String[]{"USER", "ADMIN"}),
            of("user", new String[]{"USER", "ADMIN"})
    );
}

字符串

相关问题