为了编写某个特性的测试,我必须将包含[]
的字符串强制转换为JsonNode。
问题是当它映射到JsonNode时,它似乎正在为它添加额外的引号。
我期待“[]”,但我得到的是“”[]“”,这会导致测试失败。当我在正常操作中调试代码时,在使用Postman测试代码时,我只得到“[]”,而不是在测试期间我只能得到的不工作“”[]“”。
这就是我的DTO在Spring Boot中的样子
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
public class PostLabelDTO {
private final String templateId;
private final String labels;
@JsonCreator
public PostLabelDTO(
final @JsonProperty("templateId") String templateId,
final @JsonProperty("labels") JsonNode labels
) {
this.templateId = templateId;
this.labels = labels.toString();
}
public String getId() {
return templateId;
}
public String getData() {
return labels;
}
}
我的测试必须伪造这个对象,并将属性传递给将要测试的方法。
我的测试看起来像这样:
@Test
public void getEmptyDocumentException() throws InvalidBarcodeException, EmptyStringException, InvalidBarcodeGeometryException, EmptyFieldException, TemplateNotFoundException, InvalidBarcodeStrategyException {
//defining an ID for the templateId JsonProperty
final String templateId = "fj2j931j2ijd1";
//this is the "labels" JsonNode that gets sent in through the Post request
//i checked 10 times how the value comes into the DTO and it was always "[]" (empty labels (document) object, for which I wrote this test for)
final String jsonString = "[]";
ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonParser.Feature.ALLOW_MISSING_VALUES);
JsonNode labels = mapper.valueToTree(jsonString);
//when I do this, the "[]" which is normally passed into the PostLabelDTO, becomes ""[]"", so there are extra quotes added
PostLabelDTO dto = new PostLabelDTO(templateId, labels);
final Document document = new Document(dto, templateRepository);
Exception resultingException = null;
try {
document.getPDF();
} catch (Exception e) {
e.printStackTrace();
assertThat(resultingException).isExactlyInstanceOf(EmptyDocumentException.class);
}
}
所以基本上我尝试将上面的Json放到PostLabelDTO
的新实例中作为labels
JsonNode对象用于测试目的,但它不起作用。
这是通过邮递员工作的请求(它起作用,它会抛出正确的异常)
{
"templateId":"5b1140608134691d1804e74e",
"labels":[]
}
所以基本上我尝试将上面的Json放到PostLabelDTO
的新实例中作为labels
JsonNode对象用于测试目的,但它不起作用。
这是一个工作请求(返回带有标签的PDF,每个页面都带有标签)
{
"templateId": "5b1140608134691d1804e74e",
"labels": [{
"data": {
"Ivolgnr": "Volgnr",
"Ilkw-nr": "Ilkw-nr",
"bedrijf": "Hornbach",
"wagenNr": "13513542626",
"barcode": {
"waarde": "9780471117094"
},
"leverdatumVan": "x",
"leverdatumNaar": "x",
"orderList": [{
"order": [{
"articlenumber": "29-840-4512"
},
{
"description": "Mooie grote plant"
},
{
"ordernumber": "3584479012860361"
},
{
"amount": "20"
},
{
"sellprice": "€5,00"
},
{
"deliverydate": "01-09-2018"
}
]
},
{
"order": [{
"articlenumber": "29-840-4512"
},
{
"description": "Mooie grote plant"
},
{
"ordernumber": "3584479012860361"
},
{
"amount": "20"
},
{
"sellprice": "€5,00"
},
{
"deliverydate": "01-09-2018"
}
]
},
{
"order": [{
"articlenumber": "29-840-4512"
},
{
"description": "Mooie grote plant"
},
{
"ordernumber": "3584479012860361"
},
{
"amount": "20"
},
{
"sellprice": "€5,00"
},
{
"deliverydate": "01-09-2018"
}
]
},
{
"order": [{
"articlenumber": "29-840-4512"
},
{
"description": "Mooie grote plant"
},
{
"ordernumber": "3584479012860361"
},
{
"amount": "20"
},
{
"sellprice": "€5,00"
},
{
"deliverydate": "01-09-2018"
}
]
},
{
"order": [{
"articlenumber": "29-840-4512"
},
{
"description": "Mooie grote plant"
},
{
"ordernumber": "3584479012860361"
},
{
"amount": "20"
},
{
"sellprice": "€5,00"
},
{
"deliverydate": "01-09-2018"
}
]
}
]
}
}, {
"data": {
"Ivolgnr": "22324rff",
"Ilkw-nr": "246426246",
"bedrijf": "bedrijfffff",
"wagenNr": "wagennrrrrrrr",
"barcode": {
"waarde": "9780471117094"
},
"leverdatumVan": "x",
"leverdatumNaar": "x",
"orderList": [{
"order": [{
"articlenumber": "a"
},
{
"description": "b"
},
{
"ordernumber": "c"
},
{
"amount": "d"
},
{
"sellprice": "e"
},
{
"deliverydate": "f"
}
]
}]
}
}]
}
注意 标签的模式(在此请求中称为每个标签的数据)总是可以根据用于填充的模板而变化。因此,不可能使Label对象包含所有属性,因为这些属性总是不同(取决于要用此请求填充的模板的HTML。我的服务根据标记属性名称执行“搜索和替换”
我已经尝试过了: How to parse a JSON string into JsonNode in Jackson?
但我似乎无法向JsonNode对象添加一个空数组,因为它应该是。
有人可以帮帮我吗?
此致
阿里
答案 0 :(得分:1)
所以,基本上你在代码中拥有的是:
final String jsonString = "[]";
但是,在邮递员的请求中,您发送的labels
类型为Array
,而不是String
类型。
由于此处没有太多信息,您可以查看此机构:
{
"templateId":"5b1140608134691d1804e74e",
"labels":"[]"
}
并分享输出,甚至这种(类型的差异)可能有助于您理解在尝试将数组转换为String类型时所面临的意外行为。在测试类中,您应该尝试从arrayType获取JsonNode
String[] labels in test class
更新:
使用String []
代替String
标记时,您需要在从JsonNode
获取String []
时提供传递类型。
Refer to this link on how to do that
答案 1 :(得分:1)
尝试在labels
String[]
作为PostLabelDTO
public class PostLabelDTO {
private final String templateId;
private final String[] labels;
public String[] getLabels() {
return labels;
}
@JsonCreator
public PostLabelDTO(final @JsonProperty("templateId") String templateId,
final @JsonProperty("labels") String[] labels) {
this.templateId = templateId;
this.labels = labels;
}
public String getId() {
return templateId;
}
}
然后测试以下代码:
String str[] = {};
PostLabelDTO postLabelDTO = new PostLabelDTO("fj2j931j2ijd1", str);
对于使用那个大JSON的实际请求,您应该有PostLabelDTO
,如下所示
public class PostLabelDTO {
@JsonProperty("templateId")
private String templateId;
@JsonProperty("labels")
private List<Label> labels = null;
....
}
尝试使用jsonschema2pojo链接从JSON生成POJO,它将生成正确的JAVA类,您可以使用实际的JSON请求体测试使用此调用的工作。