【问题标题】:Spring Boot 1.4 Unit Test Hibernate Validation WebMvcTestSpring Boot 1.4 单元测试 Hibernate Validation WebMvcTest
【发布时间】:2016-08-01 15:23:14
【问题描述】:

我正在尝试在 Spring Boot 1.4 中执行单元测试以测试我的验证在无效查询字符串参数上返回 400。

控制器

@RestController
@Validated
public class ExampleController {

    ...

    @RequestMapping(value = "/example", method = GET)
    public Response getExample(
            @RequestParam(value = "userId", required = true) @Valid @Pattern(regexp = MY_REGEX) String segmentsRequest {

        // Stuff here
    }

}

异常处理程序

@ControllerAdvice
@Component
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    // 400 - Bad Request
    @ExceptionHandler(value = {ConstraintViolationException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void constrainViolationHandle(HttpServletRequest request, ConstraintViolationException exception) {
        logger.error("Error Bad Request (400)");
    }

}

上下文

@Bean
public Validator validator() {
    final ValidatorFactory validatorFactory = Validation.byDefaultProvider()
            .configure()
            .parameterNameProvider(new ReflectionParameterNameProvider())
            .buildValidatorFactory();
    return validatorFactory.getValidator();
}

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
    methodValidationPostProcessor.setValidator(validator());
    return methodValidationPostProcessor;
}

单元测试

@RunWith(SpringRunner.class)
@WebMvcTest(ExampleController.class)
public class ExampleControllerTest {

    private static final String EMPTY = "";

    @Autowired
    private MockMvc mvc;

    @Test
    public void test() throws Exception {

        // Perform Request
        ResultActions response = this.mvc.perform(
            get("/example").param("userId", "invalid")
        );

        // Assert Result
        response.andExpect(status().isBadRequest())
                .andExpect(content().string(EMPTY));
    }

}

但是,当我运行测试时,我得到的是 200 而不是 400。当我作为应用程序而不是作为测试运行时,不会执行验证。

我相信这可能是因为它在执行测试时没有拾取两个验证 bean? 此验证有效

【问题讨论】:

    标签: java spring hibernate unit-testing spring-boot


    【解决方案1】:

    @WebMvcTest 您正在使用的注释是所谓的独立 MockMvc 配置之上的 Spring Boot 包装器。这个 MockMvc 功能在没有任何其他 bean 的情况下测试独立控制器。

    为了能够测试更广泛的网络配置,您需要使用web application setup

    @RunWith(SpringRunner.class)
    @WebAppConfiguration
    @ContextConfiguration("my-servlet-context.xml")
    public class MyWebTests {
    
        @Autowired
        private WebApplicationContext wac;
    
        private MockMvc mockMvc;
    
        @Before
        public void setup() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
        }
    
        // ...
    
    }
    

    但是请注意,这样的 Web 应用程序设置并没有获取所有的 bean。例如,您需要显式注册 Servler 过滤器或 Spring Security。但我认为应该包括验证。

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 2016-10-29
      • 1970-01-01
      • 2017-04-23
      • 2016-07-23
      • 2016-05-28
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多