我正在使用 Spring 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源码解决方案
您可以使用
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"})
);
}
您可以使用 JUnit5
@Nested
注释 和继承来实现类似的功能 - 您可以编写一次 test1
并让它与两个用户一起运行。例如:
public class MultipleMockUserTest {
// No @Nested annotation here
static class UserAndAdminTests {
@Test
void test1() {}
}
@Nested
@WithMockUser(username = "user", roles = {"USER", "ADMIN"})
class UserTests extends UserAndAdminTests {}
@Nested
@WithMockUser(username = "admin", roles = {"USER", "ADMIN"})
class AdminTests extends UserAndAdminTests {}
}