说我有一个像这样的Java类:
package com.example;
public class PersonUtil {
static class Person {
LocalDate dob;
String name;
Person(LocalDate dob, String name) { this.dob = dob; this.name = name;}
}
public static Person person() {
return new Person(LocalDate.now(), "bob");
}
}
然后我有common.feature
这样的文件:
@ignore
Feature:
Scenario:
* def personUtil = Java.type('com.example.PersonUtil')
,然后是一个test.feature
文件,如下所示:
Feature: Create Person
Background:
* def util = call read('common.feature')
* print util.personUtil.person();
问题在于功能文件中的dob字段看起来像以下结构:
{"dob": {"year":2019,
"month":"MAY",
"monthValue":5,
"dayOfMonth":1,
"leapYear":false,
"dayOfWeek":"WEDNESDAY",
"dayOfYear":121,
"era": "CE",
"chronology": {
"id":"ISO",
"calendarType":"iso8601"
}},
"name":"bob"}
但我希望它使用DateFormatter,因此输出为
{"dob": "2019-05-1", "name":"bob"}
有没有办法用空手道来做这件事,而无需创建另一个DTO并自行格式化LocalDate?
答案 0 :(得分:1)
是,请尝试以下操作:
* def mapper = function(x){ return { name: x.name, dob: x.dob.toString() } }
* def person = mapper(util.personUtil.person())
* print person
从上面可以很容易地发现如何进行任何转换。
答案 1 :(得分:1)
@Peter Thomas,谢谢,它确实起作用了,但是让我想了一点,最终我要做的是为ObjectMapper重用我的一个工具,将对象序列化为JSON(而objectmapper处理所有类型转换)。然后,我包装调用以使用该序列化函数获取Java对象,并将结果如以下所示将其投射回功能文件中的json:
与以前相同,但使用了新的serialise
助手`:
package com.example;
public class PersonUtil {
static class Person {
LocalDate dob;
String name;
Person(LocalDate dob, String name) { this.dob = dob; this.name = name;}
}
public static Person person() {
return new Person(LocalDate.now(), "bob");
}
public static String serialise(Object o) throws JsonProcessingException {
return ObjectMapperUtils.createObjectMapper().writeValueAsString(o);
}
}
类似于以前,但现在使用serialise
帮助程序来包装呼叫:
Feature: Create Person
Background:
* def util = call read('common.feature')
* json person = util.personUtil.serialise(util.personUtil.person());
* print person
这样,我不需要为每种需要特殊转换的Java对象类型做一个新的映射器。