Преобразование таблицы данных огурца в список пользовательских объектов, где объект имеет поля типа «Коллекция» - PullRequest
0 голосов
/ 26 февраля 2019

Допустим, в шаге сценария Cucumber есть шаг, использующий таблицу данных:

И я добавляю нового пользователя

 | 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 'User' содержит поля типа Collection:

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

и я ожидал, что эти поля будут заполнены тем, что я указал в таблице данных огурца, разделенной запятой.

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

Итак, моя проблема в том, что объект 'user' в List получит все поля из таблицы данных, за исключением assignRoles и assignAdvisorCodes, поскольку оба они имеют тип Set (на самом деле это не имеет значения,могло бы быть что-нибудь типа Коллекции).

Пожалуйста, предложите, как преодолеть это.Я использую cucumber 2.4.0, но не нашел никакого решения даже для версии 3+.Понятно, как обращаться с объектами, имеющими поля, если они являются примитивными или классовыми типами данных, но НЕ с полями типа Collection.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Если вы используете корнишон с 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, предоставленного в ответе.

0 голосов
/ 26 февраля 2019

В 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 {
}

В Огурец версии 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;
    }
...