一个测试方法中是否可以有超过1个@WithMockUser?

问题描述 投票:0回答:2

我正在使用 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源码解决方案

spring-boot spring-security reflection junit5
2个回答
1
投票

您可以使用

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"})
    );
}   


1
投票

您可以使用 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 {}
}
© www.soinside.com 2019 - 2024. All rights reserved.