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

问题描述 投票:1回答:2

假设在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的字段。

java cucumber bdd
2个回答
1
投票

在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;
    }

0
投票

如果您使用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提供的答案。

© www.soinside.com 2019 - 2024. All rights reserved.