【问题标题】:Issue with Bean Validation while testing a Spring Controller method [duplicate]测试 Spring Controller 方法时出现 Bean 验证问题 [重复]
【发布时间】:2015-08-07 09:04:11
【问题描述】:

我有一个看起来像这样的 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)。但是,在我的测试期间,我没有看到验证发生。但是,当我调用服务调用时,它们确实会发生。我可能会错过什么?

【问题讨论】:

    标签: spring spring-mvc testng hibernate-validator spring-test-mvc


    【解决方案1】:

    由于您直接在UserController 上调用add 方法,因此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(...))
           ...
        }
    }
    

    更多详情请参阅spring test doc

    【讨论】:

      猜你喜欢
      • 2015-01-06
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2013-04-16
      • 1970-01-01
      • 2020-06-13
      • 2020-04-18
      相关资源
      最近更新 更多