黄瓜没有将日期字符串从特征文件中的数据表序列化到我的pojo中的LocalDate字段

时间:2018-03-29 21:26:58

标签: java cucumber xstream cucumber-jvm cucumber-java

我试图弄清楚如何在我的步骤定义中解析黄瓜特征文件中的日期字段。

class Person{ 
  String name
  LocalDate dob
}

scenario: do something with people
Given  list of people:
                     |name|dob|
                     | john| 20-09-2001|

@Given("^list of people:")
public void doSomething(List<Person> people) {

}

请注意我无法访问Person类,我确定我必须编写自己的转换器或注册某个库中某人编写的转换器,在搜索了我能看到的唯一选项后,可以更改它们的pojo java.time.LocalDate字段上的@Transform。

我目前正在收到以下异常

cucumber.runtime.CucumberException:              cucumber.deps.com.thoughtworks.xstream.converters.ConversionException: Cannot deserialize object with new readObject()/writeObject() methods
---- Debugging information ----
class               : java.time.LocalDate
required-type       : java.time.LocalDate
converter-type      : cucumber.deps.com.thoughtworks.xstream.converters.reflection.SerializableConverter
path                : /list/com.pkg.Person/dob

我已经尝试将dateformat更改为yyyy-MM-dd,这通常有效,但在这种情况下不行。对于如何设置和注册自定义转换器

的任何指示,我将不胜感激

我的黄瓜依赖关系如下,如果需要更新版本,我可以将它们变为chane。如果它有任何区别。

    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>2.4.0</version>
    </dependency>

    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>2.4.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>2.4.0</version>
    </dependency>

1 个答案:

答案 0 :(得分:3)

Cucumber不支持自动转换新的java日期时间类。但它支持转换为旧的util Date类,因为您没有对数据对象的写访问权,所以没有用。

为此,您需要在测试运行器上使用@XStreamConverters注释。这会将自定义xstream转换器添加到黄瓜的开箱即用转换器中。

@RunWith(Cucumber.class)
@CucumberOptions(plugin = { ""}, tags = { "" }, glue = "stepdefs",
        features = "" ) --> use your own values
@XStreamConverters(@XStreamConverter(LocalDateCon.class))
public class RunSampleTest {

现在转换器类将字符串解析为LocalDate并创建数据对象的集合。这将支持&#34; 15-05-2016&#34;等日期。只需根据您的日期格式更改DEFAULT_DATE_PATTERN

public class LocalDateCon implements Converter{

    public boolean canConvert(Class type) {
        //return type.equals(LocalDate.class);
        return LocalDate.class.isAssignableFrom(type);
    }

    private static final String            DEFAULT_DATE_PATTERN = "dd-MM-yyyy";
    private static final DateTimeFormatter DEFAULT_DATE_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN);

    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
        LocalDate  date = (LocalDate) value;
        String result = date.format(DEFAULT_DATE_FORMATTER);
        writer.setValue(result);
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        LocalDate result = LocalDate.parse(reader.getValue(), DEFAULT_DATE_FORMATTER);
        return result;
    }

}

此外,您将无法干净地使用@Transform注释,因为它仅适用于单个值而非集合。我干净利用,因为需要在转换器代码中创建对象,这很麻烦。