testng - 如何为独立 MockMvc 启用 Controller 参数验证

标签 testng spring-test mockmvc spring-test-mvc

Controller

@RestController
@Validated
class MyController {

    @GetMapping("/foo")
    public String unwrapped(@Min(1) @RequestParam("param") int param) {
        return Integer.toString(param);
    }

    @GetMapping("/bar")
    public String wrapped(@ModelAttribute @Valid Wrapper bean) {
        return Integer.toString(bean.param);
    }

    static class Wrapper {

        @Min(1)
        int param;

        public void setParam(final int param) {
            this.param = param;
        }
    }
}

测试

public class MyControllerTest {

    MyController controller = new MyController();
    MockMvc mockMvc = MockMvcBuilders
            .standaloneSetup(this.controller)
            .build();

    @Test // fails
    public void unwrapped() throws Exception {
        this.mockMvc.perform(get("/foo")
                .param("param", "0"))
                .andExpect(status().isBadRequest());
    }

    @Test // passes
    public void wrapped() throws Exception {
        this.mockMvc.perform(get("/bar")
                .param("param", "0"))
                .andExpect(status().isBadRequest());
    }
}

要在 Spring 中启用(展开的)方法参数验证, Controller 必须使用 @Validated 进行注释,并且 MethodValidationPostProcessor 必须添加到上下文中。
是否可以将 MethodValidationPostProcessor bean 添加到独立设置中?
问题可能会简化为如何将 BeanPostProcessor 添加到独立的 MockMvc 设置中?

最佳答案

Is it possible to add the MethodValidationPostProcessor bean to the standalone setup ?

不,不幸的是,使用 MockMvcBuilders.standaloneSetup() 时这是不可能的。因为这会创建一个 StubWebApplicationContext 支持的幕后BeanPostProcessor s。

一次SPR-6380已解决(当前在 Spring Framework 5.x 待办事项中),您将不再需要依赖 MethodValidationPostProcessor 。但是,在此期间您将需要切换到使用 MockMvcBuilders.webAppContextSetup()为了能够测试通过 MethodValidationPostProcessor 添加到 Controller 的行为.

原始错误建议

我认为不可能直接做到这一点;但是,您可以创建 StandaloneMockMvcBuilder 的自定义子类覆盖 initWebAppContext()方法,委托(delegate)给super.initWebAppContext()创建WebApplicationContext ,然后注册MethodValidationPostProcessor bean 以编程方式通过 org.springframework.test.web.servlet.setup.StubWebApplicationContext.addBean(String, Object) .

关于testng - 如何为独立 MockMvc 启用 Controller 参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49160611/

相关文章:

java - 我创建了一个页面对象模型,但我的登录页面为空。我该如何解决这个问题?

Spring 测试 DBUnit : Unable to load dataset from file

java - 为所有测试类设置自定义 TestExecutionListener,这样我就可以记录抛出的每个异常/断言的堆栈跟踪

java - 将 SecurityContextHolder.setContext(...) 设置为模拟,即使使用 @DirtiesContext 也会传递到不同的测试类

java - Spring Testing Mock MVC 不应用自定义 RequestMappingHandlerMapping

TestNG:@Test 在类级别执行所有方法

eclipse - 无法读取http ://beust. com/eclipse上的存储库

java - 当它不可 Autowiring 时,有选择地将单个过滤器从 Spring Security 应用于 MockMvc

rest-assured - RestAssured vs Mockmvc 用于单元和集成测试

spring-security - 使用 MockMVC 集成测试 Spring Boot