【问题标题】:Not the right Xstream converter selected by Cucumber不是 Cucumber 选择的正确 Xstream 转换器
【发布时间】:2015-11-12 06:18:22
【问题描述】:

到目前为止,我已经在几十个 Java 项目中使用过 Cucumber,之前从未遇到过这个问题,所以我有点困惑。

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

  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 {
...
}

字段被正确映射,我得到一个包含一个交易项目的列表,很好。当我进入调试时,最多 cucumber.runtime.xstream.LocalizedXStreams

Converter converter = converterLookup.lookupConverterForType(clazz);

我看到一个 xStream ReflectionConverted 被选中用于数据表解析。

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

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

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

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

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

这真的是问题的根本原因吗?

谢谢

【问题讨论】:

    标签: java xstream cucumber-jvm cucumber-java


    【解决方案1】:

    我自己只是遇到了这个非常令人惊讶的行为 - 在我的情况下,问题结果是 DynamicClassWithStringAssignableConverter.canConvert 返回 true 如果要转换的类型有一个带有单个 String 参数的构造函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2015-04-07
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多