【发布时间】:2017-12-12 14:04:04
【问题描述】:
我正在研究 Spring in Action 4 一书的第 5 章示例。当我运行测试类时,我发现其中一个 @Valid 测试不起作用,看起来好像从未发生过验证(返回状态代码302 并且视图的名称是“/spitter/null”)。但是,当我在 Tomcat 中运行它时,它运行良好。
验证 jars(hibernate-validator 及其依赖项)使用 Maven 加载。
整个项目在github。
有什么想法吗?
测试代码sn-p:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes={RootConfig.class, WebConfig.class})
public class SpitterControllerTest {
@Test
public void shouldFailValidationWithNoData() throws Exception {
SpitterRepository mockRepository = mock(SpitterRepository.class);
SpitterController controller = new SpitterController(mockRepository);
MockMvc mockMvc = standaloneSetup(controller).build();
mockMvc.perform(post("/spitter/register"))
.andExpect(status().isOk())
.andExpect(view().name("registerForm"))
.andExpect(model().errorCount(5))
.andExpect(model().attributeHasFieldErrors(
"spitter", "firstName", "lastName", "username", "password", "email"));
}
}
SpitterController sn-p:
@RequestMapping(value="/register", method=POST)
public String processRegistration(
@Valid Spitter spitter,
Errors errors) {
if (errors.hasErrors()) {
return "registerForm";
}
spitterRepository.save(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}
Spitter sn-p:
@NotNull
@Size(min=5, max=16)
private String username;
@NotNull
@Size(min=5, max=25)
private String password;
@NotNull
@Size(min=2, max=30)
private String firstName;
@NotNull
@Size(min=2, max=30)
private String lastName;
@NotNull
@Email
private String email;
非常感谢!
【问题讨论】:
-
是否需要使用standaloneSetup?您是否考虑过 webAppContextSetup?
-
我刚刚尝试了 webAppContextSetup,它抛出了
org.springframework.dao.DataIntegrityViolationException,因为列用户名不允许插入 null。尽管如此,@Valid验证并没有发生。如果经过验证,则不应抛出异常。
标签: spring unit-testing spring-mvc bean-validation jsr