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

Cucumber not serializing date string from datatable in feature file to a LocalDate field inside my pojo

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

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) {

}

请注意,我无权访问此人 class,我确定我必须编写自己的转换器或注册某个图书馆的某人编写的转换器,在搜索了我能看到的唯一选项之后是在 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

我试过将日期格式更改为 yyyy-MM-dd,这通常有效,但这次无效。如果能提供有关如何设置和注册自定义转换器的任何指示,我将不胜感激

我的黄瓜依赖项如下,如果需要,我可以将它们更改为更新版本,如果有任何不同的话。

    <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>

Cucumber 不支持自动转换新的 java 日期时间 classes。但它确实支持转换为旧的 util Date class,这是没有用的,因为您没有对数据对象的写访问权限。

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

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

现在转换器 class 将字符串解析为 LocalDate 并创建数据对象集合。这将支持像“15-05-2016”这样的日期。只需根据您的日期格式更改 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 注释,因为它仅适用于单个值而不适用于集合。我用得很干净,因为需要在混乱的转换器代码中创建对象。