Преобразование таблицы данных огурца в список пользовательских объектов, где объект имеет поля типа "Коллекция"

55
5

Допустим, в шаге сценария 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 (на самом деле это не имеет значения, это может быть что-то типа Collection).

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

спросил(а) 2020-04-04T01:27:00+03:00 3 месяца назад
1
Решение
54

В 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 Cucumber и выше 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;
}

ответил(а) 2020-04-04T01:41:07.736507+03:00 3 месяца назад
39

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

ответил(а) 2020-04-04T01:27:00+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема