0

У меня есть Spring RestController, который выглядит примерно так:Проблема с Bean Validation при тестировании метода Spring Controller

... 
import javax.validation.Valid; 
... 
@RestController 
@RequestMapping(value = "/users", consumes = { MediaType.APPLICATION_JSON }, produces = { MediaType.APPLICATION_JSON }) 
public class UserController 
{ 
    @Autowired 
    private UserService userService; 

    @RequestMapping(method = RequestMethod.POST) 
    public @ResponseBody User add(@RequestBody @Valid User user) 
    { 
     ... 
    } 
    ... 
} 

PS: @Valid рядом с пользователем: Здесь у меня есть проблема.

Это один из тестов для контроллера:

@ContextConfiguration(classes = { TestAppConfig.class, PersistenceConfig.class }, loader = AnnotationConfigWebContextLoader.class) 
@WebAppConfiguration 
public class UserControllerTest extends AbstractTestNGSpringContextTests 
{ 
    @Autowired 
    private UserController userController; 

    @Test 
    public void addTest() 
    { 
     User user = new User(); 
     ... 
     userController.add(user); 
     ... 
    } 
} 

TestAppConfig выглядит примерно так:

@Configuration 
@ComponentScan(basePackages = {Constants.BEANS_BASE_PACKAGE}) 
@PropertySource(value = { "classpath:application.properties" }) 
@EnableAspectJAutoProxy 
@EnableWebMvc 
class TestAppConfig extends WebMvcConfigurerAdapter 
{ 
} 

Проблема: Все, кроме @Valid работает отлично (вызов службы). Здесь @Valid: javax.validation.Valid аннотация, которую я хочу использовать для простых проверок (реализация = Hibernate Bean Validator). Тем не менее, во время моих тестов я не вижу проверки. Однако это происходит, когда я вызываю вызовы службы. Что я могу пропустить?

ответ

0

Поскольку вы вызываете метод add непосредственно на UserController, пружина не может перехватить ваш запрос и выполнить магию проверки. Это лучше использовать MockMvc и выполнять ваши запросы на ней, как следующее:

@ContextConfiguration(classes = { TestAppConfig.class, PersistenceConfig.class }, loader = AnnotationConfigWebContextLoader.class) 
@WebAppConfiguration 
public class UserControllerTest extends AbstractTestNGSpringContextTests 
{ 
    @Autowired private WebApplicationContext wac; 
    private MockMvc mvc; 

    @Before 
    public void setUp() { 
     mvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
    } 

    @Test 
    public void addTest() 
    { 
     User user = new User(); 
     ... 
     mvc.perform(post('/users') 
        .content(...) 
        .contentType(...) 
        .accept(...)) 
     ... 
    } 
} 

см spring test doc для более подробной информации.