gpt4 book ai didi

java - 将 cucumber 数据表转换为自定义对象列表,其中对象具有 'Collection' 类型的字段

转载 作者:行者123 更新时间:2023-11-30 05:45:40 24 4
gpt4 key购买 nike

假设 Cucumber 场景步骤中有一个使用数据表的步骤:

And I add a new user

 | firstName | lastName | workEmail        | workPhone      | userName | assignedRoles       | assignedAdvisorCodes |
| Steven | Gerrard | steeveg@test.com | 12312312346345 | steeveg | Advisor,Compliance | 1107,1108 |

然后步骤定义将如下所示

@And("^I add a new user$")

public void i_add_a_new_user(List<User> users) {

要点是“User”POJO 包含 Collection 类型的字段:

public class User {
private Set<String> assignedRoles;
private Set<String> assignedAdvisorCodes;

我希望这些字段填充我在 cucumber 数据表中指定的内容,并用逗号分隔。

==================

所以,我的问题是列表中的“用户”对象将被分配数据表中的所有字段,除了分配的角色和分配的顾问代码,因为它们都是 Set 类型(实际上这并不重要,它可以是 Collection 的任何内容)类型)。

请建议如何克服这个问题。我使用 Cucumber 2.4.0,但即使对于 3+ 版本也没有找到任何解决方案。很清楚如何处理具有原始或类数据类型字段的对象,但不处理 Collection 类型的字段。

最佳答案

Cucumber 版本 2.4.0 中,可以使用 XStream 自定义转换。

public class SetStringConverter implements Converter{

@Override
public boolean canConvert(Class arg0) {
return Set.class.isAssignableFrom(arg0);
}

@Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1, MarshallingContext arg2) {

}

@Override
public Object unmarshal(HierarchicalStreamReader arg0, UnmarshallingContext arg1) {
return new HashSet<String>(Arrays.asList(arg0.getValue().split(",")));
}
}

有两种方法可以声明它以供 XStream 使用。首先,可以在 POJO 中声明它。这是更好的使用方式。

@XStreamConverter(value = SetStringConverter.class)
private Set<String> assignedRoles;
@XStreamConverter(value = SetStringConverter.class)
private Set<String> assignedAdvisorCodes;

否则可以在运行器上全局声明它们。那么就不需要在POJO上声明了。

@XStreamConverters({
@XStreamConverter(value = SetStringConverter.class)
})
public class RunCucumberTest {
}
<小时/>

Cucumber 版本 3 及更高版本中,XStream 消失了。下面的类在项目中是唯一的,需要在声明的粘合路径中可用。

public class Configurer implements TypeRegistryConfigurer {

@Override
public void configureTypeRegistry(TypeRegistry registry) {

registry.defineDataTableType(new DataTableType(User.class, new TableEntryTransformer<User>() {
@Override
public User transform(Map<String, String> entry) {
return User.createUser(entry);
}
}));
}

@Override
public Locale locale() {
return Locale.ENGLISH;
}
}

在 User POJO 中,您需要添加 createUser 方法。

public static User createUser(Map<String, String> entry) {
User user = new User();
user.firstName = entry.get("firstName");
user.lastName = entry.get("lastName");
user.assignedRoles = new HashSet<String>(Arrays.asList(entry.get("assignedRoles").split(",")));
user.assignedAdvisorCodes = new HashSet<String>(Arrays.asList(entry.get("assignedAdvisorCodes").split(",")));
return user;
}

关于java - 将 cucumber 数据表转换为自定义对象列表,其中对象具有 'Collection' 类型的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54884065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com