假设在黄瓜方案步骤中有一个使用数据表的步骤:
然后我添加一个新用户
| firstName | lastName | workEmail | workPhone | userName | assignedRoles | assignedAdvisorCodes |
| Steven | Gerrard | steeveg@test.com | 12312312346345 | steeveg | Advisor,Compliance | 1107,1108 |
然后步骤定义如下
@And(“ ^我添加一个新用户$”)
public void i_add_a_new_user(List<User> users) {
要点在于“用户” POJO包含类型为Collection的字段:
public class User {
private Set<String> assignedRoles;
private Set<String> assignedAdvisorCodes;
,我希望这些字段将填充我在以逗号分隔的黄瓜数据表中指定的内容。
=================
所以,我的问题是List中的'user'对象将被分配数据表中的所有字段,但AssignedRoles和AssignedAdvisorCodes除外,因为它们都是Set类型的(实际上没关系,它可能是Collection的任何东西类型)。
请提出解决方法。我使用的是Cucumber 2.4.0,但即使是3+版也没有找到任何解决方案。很明显,如何处理具有原始或类数据类型的字段但不处理具有Collection类型的字段的对象。
答案 0 :(得分:1)
在黄瓜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 {
}
在黄瓜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;
}
}
在用户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;
}
答案 1 :(得分:0)
如果您使用gherkin with qaf,则受支持。您需要提供以下数据表:
And I add a new user
| firstName | lastName | workEmail | workPhone | userName | assignedRoles | assignedAdvisorCodes |
| Steven | Gerrard | steeveg@test.com | 12312312346345 | steeveg | [Advisor,Compliance]| [1107,1108] |
如果是黄瓜,您需要提供答案中提供的@Grasshopper作为转换器。