Проблема с проверкой Bean при тестировании метода Spring Controller

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

...
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). Однако во время моих тестов я не вижу, чтобы происходили проверки. Однако они случаются, когда я вызываю сервисные вызовы. Что я мог упустить?


person TJ-    schedule 07.08.2015    source источник


Ответы (1)


Поскольку вы вызываете метод add непосредственно для UserController, Spring не может перехватить ваш запрос и выполнить магию проверки. Лучше использовать 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(...))
       ...
    }
}

см. документ по весеннему тесту для более подробной информации.

person Ali Dehghani    schedule 07.08.2015