假设在Cucumber场景步骤中有一个步骤使用数据表:
我添加了一个新用户
| firstName | lastName | workEmail | workPhone | userName | assignedRoles | assignedAdvisorCodes |
| Steven | Gerrard | [email protected] | 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类型的任何东西)。
请建议如何克服这一点。我使用黄瓜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;
}
}
在用户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;
}
如果您使用gherkin with qaf,则支持。您需要提供如下数据表:
And I add a new user
| firstName | lastName | workEmail | workPhone | userName | assignedRoles | assignedAdvisorCodes |
| Steven | Gerrard | [email protected] | 12312312346345 | steeveg | [Advisor,Compliance]| [1107,1108] |
如果是黄瓜,你需要提供变压器作为@Grasshopper提供的答案。