2016-08-01 12 views
2

Ich versuche, einen Komponententest in Spring Boot 1.4 durchzuführen, um zu testen, ob meine Validierung eine 400 für einen ungültigen Abfragezeichenfolgenparameter zurückgibt.Spring Boot 1.4 Komponententest Hibernate Validation WebMvcTest

-Controller

@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 
    } 

} 

Exception Handler

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

} 

Kontext

@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; 
} 

Einheit Test

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

} 

Allerdings, wenn ich meinen Test laufen bekomme ich ein 200 kein 400. Die Validierung wird nicht durchgeführt, wenn ich als Anwendung nur als Test ausgeführt werde.

Ich glaube, es kann daran liegen, dass die beiden Validierungsbeans beim Ausführen des Tests nicht aufgenommen wurden? Diese Validierung funktioniert

Antwort

1

@WebMvcTest Annotation, die Sie verwenden, ist Spring Boot Wrapper auf so genannte eigenständige MockMvc-Konfiguration. Diese MockMvc-Funktion testet einen eigenständigen Controller ohne andere Beans.

Um in der Lage sein, größere Konfiguration Web testen Sie web application setup verwenden müssen:

@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(); 
    } 

    // ... 

} 

Beachten Sie aber, dass eine solche Web-Anwendungs-Setup nicht über alle abholen die Bohnen. Zum Beispiel müssten Sie explizit Servler-Filter oder Spring Security registrieren. Aber ich glaube, Validierung sollte enthalten sein.

+0

Ich habe das versucht, aber dann bekomme ich 404s – ptimson

Verwandte Themen