不是由Cucumber选择的正确的Xstream转换器

时间:2015-08-19 05:29:06

标签: java xstream cucumber-jvm cucumber-java

到目前为止,我一直在使用Cucumber进行数十个Java项目,以前从未遇到过这个问题,所以我有点困惑。

我有一个简单的表格,我想在步骤定义中映射到List。

  And deal repository contains
  | dealPid | closingDate | expenseCode |
  | 1       | 01/06/2015  | test        |

我开始创建自己的POJO只包含必填字段,遵循标准的驼峰惯例(为清晰起见,省略了getter / setter)

public class Deal {

     private String dealPid ;
     private Date closingDate ;
     private String expenseCode;
}

我的步骤定义:

@Given("^deal repository contains$")
public void deal_repository_contains(
        @Format("dd/MM/yyyy") List<DEAL> deals) throws Throwable {
...
}

字段得到正确映射,我得到一个带有一个Deal项目的List,很好。当我进入调试时,最多到cucumber.runtime.xstream.LocalizedXStreams

Converter converter = converterLookup.lookupConverterForType(clazz);

我看到为数据表解析选择了xStream ReflectionConverted

这是一个遗留项目,其他开发人员随后告诉我,已经存在一个类。所以现在我想切换到那个类,它遵循非常奇怪的约定:类名是它在DB中映射的表名,大多数属性名实际上是列名。

所以现在我在我的步骤定义中使用来自另一个包的这个传统DEAL类,所以我期待一个List出现,但它没有。我得到一个List但是第一行被解析了。在调试中,我看到被选中的转换器是 DynamicClassWithStringAssignableConverter 而不是之前的ReflectionConverter,这就是解析结果最终不同的原因。

不幸的是,我无法进一步调试并理解为什么选择此实现,因为Xstream在cucumber-jvm-deps中重新打包而Eclipse丢失(或者我不知道如何附加在这种情况下正确地来源。)

我尝试在DEAL类中暂时添加我需要的字段(与我最初的Deal类中相同),但它不起作用。 最初,DEAL类正在实现Serializable:我删除了它,但仍然是相同的行为。

实际上看起来是因为类名是全大写的,所以选择了不同的Xstream转换器......

它真的可能是问题的根本原因吗?

由于

1 个答案:

答案 0 :(得分:0)

我自己也发现了这个非常令人惊讶的行为 - 在我的情况下,如果要转换的类型有一个构造函数需要一个DynamicClassWithStringAssignableConverter.canConvert,那么问题就是true返回String }参数。

解决方法是删除构造函数!