我有一个DropWizard表示,它有一个ValidationMethod。当我尝试为它编写单元测试时,虽然当我使用jackson时,ObjectMapper正在向json字符串插入一个有效的{name_of_other_property}:boolean。
这打破了拥有灯具的系统,并将ObjectMapped输出与一些固定的json文件进行比较。有没有其他人遇到过这个并找到最好的解决方法?
编辑添加示例
public class Cat {
@NotEmpty
private String name;
@JsonProperty
public String getName() {
return name;
}
@JsonProperty
public void setName(String name) {
this.name=name;
}
@ValidationMethod(message = "Not a cat name!")
public boolean isValidCatName() {
return (!"Fido".equals(this.name));
}
}
我正在关注灯具的DropWizard测试文档: https://dropwizard.github.io/dropwizard/manual/testing.html
但我从对象映射器返回Json mapper.writeValueAsString(object)给了json一个额外的属性:
{
name:"Felix"
validCatName:true
}
这意味着单元测试失败了。当我使用表示作为我的资源的参数时,我没有注意到这个额外的字段存在。
谢谢, 伊恩
编辑:解决方案是将@JsonIgnore注释添加到验证方法中。
答案 0 :(得分:1)
我有一些类似的问题。我不知道我是否正确,但对我来说似乎验证方法存在命名问题。让我工作的唯一方法是重命名验证方法。在您的情况下,“isName”而不是“isValidVatName”。也许你可以尝试并给出答案,如果这解决了你的问题。只需用这种方式命名验证方法:“is”+ {json属性的名称;在你的情况下'name'}。
对我来说,这并不重要,如何编写json属性(大写与否)。因此,即使属性'catName'也可以使用此验证方法名称:
使用以下格式非常重要:“is”+ propertyName。但我不确定这是否总是如此。也许camelCase或snakecase之间存在差异(=未测试)
修正代码示例:
public class Cat {
@NotEmpty
private String name;
@JsonProperty
public String getName() {
return name;
}
@JsonProperty
public void setName(String name) {
this.name=name;
}
@ValidationMethod(message = "Not a cat name!")
public boolean isName() {
return (!"Fido".equals(this.name));
}
}
答案 1 :(得分:1)
有两种方法可以解决它。
明确指定mapper为忽略此类属性
@ValidationMethod(message = "Not a cat name!")
@JsonIgnore
public boolean isValidCatName() {
return (!"Fido".equals(this.name));
}
这将返回所需的结果。
Mapper有一些默认属性可以帮助自动检测,你可以禁用这些属性
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig()
.getDefaultVisibilityChecker()
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.NONE)
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE)
.withFieldVisibility(JsonAutoDetect.Visibility.NONE));
两者都会产生结果。
干杯!