空手道定制Java序列化器返回值

时间:2019-05-01 10:12:11

标签: karate

说我有一个像这样的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?

2 个答案:

答案 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对象类型做一个新的映射器。