2016-08-01 39 views
2

我想在Spring Boot 1.4中執行單元測試來測試我的驗證返回無效查詢字符串參數400。Spring Boot 1.4單元測試休眠驗證WebMvcTest

控制器

@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? 此驗證工作

回答

1

@WebMvcTest您使用的註釋是在所謂的獨立MockMvc配置之上的Spring Boot包裝。這MockMvc功能測試獨立控制器沒有任何其他豆。

爲了能夠測試更廣泛的網絡配置,您需要使用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應用程序安裝不拿起所有的豆類。例如,您需要顯式註冊Servler過濾器或Spring Security。但我認爲應包括驗證。

+0

我試過這個,但後來我得到404s – ptimson