Пользовательский сериализатор для каратэ - PullRequest
1 голос
/ 01 мая 2019

Скажем, у меня есть такой класс 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 ]

1 голос
/ 02 мая 2019

@ Питер Томас, Спасибо, это работает, но это заставило меня задуматься, и в итоге я использовал одно из моих утилит для ObjectMapper для сериализации Object в JSON (и этот objectmapper обрабатывает все преобразования типов). Затем я обертываю вызов, чтобы получить объекты Java с этой функцией сериализации, и приведу результат обратно в json в файле объектов, как показано ниже:

То же, что и раньше, но с новым serialise helper`:

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, который требует специальных преобразований.

1 голос
/ 01 мая 2019

Да, попробуйте это:

* def mapper = function(x){ return { name: x.name, dob: x.dob.toString() } }
* def person = mapper(util.personUtil.person())
* print person

Исходя из вышесказанного, вам будет легко понять, как выполнить любой вид конверсии.

...