将黄瓜数据表转换为自定义对象列表,其中对象具有“集合”类型的字段

时间:2019-02-26 11:03:56

标签: java cucumber bdd

假设在黄瓜方案步骤中有一个使用数据表的步骤:

  

然后我添加一个新用户

 | 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类型的字段的对象。

2 个答案:

答案 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作为转换器。