2

을 테스트하기 위해 어떻게 조치를 저장에 대한 몇 가지 절전 @NotEmpty 등의 검증을위한 주석, @Pattern .. 등 내 컨트롤러에서내 기관에서 @Valid

을 가지고, 그것은 @Valid 매개 변수가 있습니다.

그러나 엔티티에 필수 입력란이 있고 주석이없는 경우 문제가 발생합니다.

각 엔티티에 필요한 메모가 있는지 확인하기 위해 각 엔티티를 테스트하고 싶습니다.

뭔가 같은 :

@Test(expect=IllegalArgumentException.class) 
public void testAllNull() { 
    Person p = new Persson(); // Person name has an @NotEmpty 
    validator.validate(p); 
} 

하지만 어떻게 그것을 검증? @Valid를 확인하기 위해 누가 호출 되었습니까?

감사합니다.

답변

2

내가 확인하는 방법을 발견 :

@Autowired 
    private LocalValidatorFactoryBean validator; 

    ... 

    validator.validateProperty(object, propertyName) 
0

Spring MVC Test Framework가 좋은 선택이 될 수 있습니다. 이것을 사용하면 Spring @MVC가 실제로 작동하는 것처럼 테스트에서 유효성 검사가 코드를 실행한다는 것을 확신 할 수 있습니다.

사실, @Valid 주석은 HandlerMethodInvoker에 의해 감지되며, 이는 스프링 컨트롤러의 핸들러 메소드에 대한 주석을 처리합니다. 내부적으로 실제 유효성 검증 로직은 응용 프로그램 컨텍스트 설정에 따라 Validator bean에 위임됩니다. (하이버 네이트 검사기가 널리 사용되고있다.)

을 기본 구성 (예컨대 <mvc:annotation-driven />)으로 LocalValidatorFactoryBean는 @Falci는 바와 같이 @Valid 애노테이션을 처리하기 위해 내부적으로 사용되지만 때때로 다를 수있다. 대신, Spring MVC Test Framework은 메인 어플리케이션이 사용하는 환경과 동일한 환경을 제공하므로 좋은 선택입니다.

2

여기에는 오류가 발생했을 때 사용자 정의 JSON 응답의 주석과 빌드를 확인하는 테스트의 Spring v4.1.x 기반 예제가 있습니다.

의 JUnit

import com.fasterxml.jackson.core.type.TypeReference; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.context.annotation.Bean; 
import org.springframework.http.MediaType; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.web.servlet.MockMvc; 
import org.springframework.test.web.servlet.MvcResult; 
import org.springframework.test.web.servlet.setup.MockMvcBuilders; 

import javax.inject.Inject; 
import java.util.List; 

import static org.abtechbit.miscboard.util.JsonUtils.toJson; 
import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.CoreMatchers.notNullValue; 
import static org.junit.Assert.assertThat; 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { 
     RegistrationValidationTest.MockDependencies.class, 
}) 
public class RegistrationValidationTest { 

    @Inject 
    MockMvc mvc; 

    @Test 
    public void validatesRegistration() throws Exception { 
     Registration registration = ... //build an invalid Registration object 
     MvcResult result = mvc.perform(post(RegistrationController.CONTEXT_REGISTER). 
       contentType(MediaType.APPLICATION_JSON). 
       content(toJson(registration))). 
       andExpect(status().isBadRequest()). 
       andExpect(content().contentType(MediaType.APPLICATION_JSON)). 
       andReturn(); 

     assertThat(result.getResolvedException(), is(notNullValue())); 
     String content = result.getResponse().getContentAsString(); 
     assertThat(content, is(notNullValue())); 
     List<Message> messages = JsonUtils.fromJson(content, new TypeReference<List<Message>>() { 
     }); 
     assertThat(messages.size(), is(1)); 
    } 

    public static class MockDependencies { 

     @Bean 
     public MockMvc mvc() { 
      return MockMvcBuilders.standaloneSetup(new RegistrationController()).build(); 
     } 
    } 
} 

컨트롤러

import org.springframework.http.HttpStatus; 
import org.springframework.http.MediaType; 
import org.springframework.http.ResponseEntity; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.MethodArgumentNotValidException; 
import org.springframework.web.bind.annotation.*; 

import javax.validation.Valid; 
import java.util.List; 
import java.util.stream.Collectors; 

@Controller 
public class RegistrationController 
{ 
    public static final String CONTEXT_REGISTER = "/register"; 

    @RequestMapping(value = CONTEXT_REGISTER, method = RequestMethod.POST) 
    @ResponseBody 
    public String register(@RequestBody @Valid Registration registration) { 
     //perform registration 
    } 

    @ExceptionHandler(MethodArgumentNotValidException.class) 
    public ResponseEntity<List> handleValidationException(MethodArgumentNotValidException ex) { 
     //Build a list of custom Message{String message;} objects 
     List<Message> messages = ex.getBindingResult().getAllErrors(). 
       stream().map(e->new Message(e.getDefaultMessage())).collect(Collectors.toList()); 
     return ResponseEntity.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON).body(messages); 
    } 
} 
관련 문제