0

我有一个看起来像这样的 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:除了工作正常(调用服务)之外的一切。这@Validjavax.validation.Valid我希望用于简单验证的注释(实现 = Hibernate Bean Validator)。但是,在我的测试期间,我没有看到验证发生。但是,当我调用服务调用时,它们确实会发生。我会错过什么?

4

1 回答 1

0

由于您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(...))
       ...
    }
}

有关更多详细信息,请参阅弹簧测试文档

于 2015-08-07T09:35:07.497 回答