如何单元测试Spring MVC验证注释错误消息?

时间:2013-11-20 19:43:19

标签: java unit-testing spring-mvc

假设我有一个这样的模型类:

public class User {
    @NotEmpty(message = "Email is required")
    private String email;
}

我希望能够对自定义错误消息“需要电子邮件”进行单元测试

到目前为止,我有这个单元测试代码可以使用,但不会检查错误消息。

@Test
public void should_respond_bad_request_with_errors_when_invalid() throws Exception
{
    mock().perform(post("/registration/new"))
            .andExpect(status().isBadRequest())
            .andExpect(view().name("registration-form"))
            .andExpect(model().attributeHasFieldErrors("user", "email"));
}

2 个答案:

答案 0 :(得分:1)

好像你不能。

但我建议你通过attributeHasFieldErrorCode方法解决。

拥有以下内容:

@NotNull(message="{field.notnull}")
@Size(min=3, max=3, message="{field.size}")
public String getId() {
    return id;
}

我在我的测试方法中有以下内容(如果我的数据因最小或最大约束而失败,它属于@Size注释)

.andExpect(model().attributeHasFieldErrorCode("persona", "id", is("Size")))

.andExpect(model().attributeHasFieldErrorCode("persona", "id", "Size"))

该方法有两个版本,包含和不包含Hamcrest

即使您使用message = "Email is required"(原始/直接内容)并使用message="{field.size}")要从.properties文件中使用的密钥,我们的message 属性也是如此 内容几乎属于一种独特的注释。在您的情况下为@NotNull,在我的情况下为Size

因此,在某种程度上无关紧要的是什么是消息(原始或密钥),重要的是该消息的所有者(在这种情况下是注释)完成了它的工作并且它已经通过{{1}进行了验证方法。

不要与类似的方法名称混淆:attributeHasFieldErrorCodeattributeHasFieldErrors

答案 1 :(得分:-1)

我遇到了同样的问题。我找到了下面描述的一些解决方案。主要思想是检查错误代码,而不是错误消息。

BindingResult bindingResult = (BindingResult)
mock().perform(post("/registration/new")).andReturn().getModelAndView().getModelMap().get("org.springframework.validation.BindingResult.user");

 assertEquals(bindingResult.getFieldError(email).getCode(), "error.code");