Огурец Java - Как использовать возвращенную строку из шага в следующем шаге?
Мне нужно автоматизировать некоторые веб-сервисы, я создаю несколько методов для этого и хочу использовать для этого Cucumber, но я не могу понять, как использовать возвращаемое значение на следующем шаге.
Итак, у меня есть эта особенность:
Feature: Create Client and place order
Scenario: Syntax
Given I create client type: "66"
And I create for client: "OUTPUTVALUEfromGiven" an account type "123"
And I create for client: "OUTPUTVALUEfromGiven" an account type "321"
And I want to place order for: "outputvalueFromAnd1"
и у меня есть эти шаги:
public class CreateClientSteps {
@Given("^I create client type: \"([^\"]*)\"$")
public static String iCreateClient(String clientType) {
String clientID = "";
System.out.println(clientType);
try {
clientID = util.createClient(clientType);
} catch (IOException e) {
e.printStackTrace();
}
return clientID;
}
@And("^I create for client: \"([^\"]*)\" an account type \"([^\"]*)\"$")
public static String createAccount(String clientID, String accountType) {
String orderID = "";
try {
orderID = util.createAccount(clientID,accountType);
} catch (IOException e) {
e.printStackTrace();
}
return orderID;
}
}
Есть ли способ использовать возвращаемые значения от шага к шагу?
Спасибо!
2 ответа
Я решил по-другому, я знаю вопрос, который был в прошлом году, но, возможно, кто-то найдет это полезным в будущем.
Итак, я создал "ClientsMap.java", где я храню результаты из последних предложений. EX:
public class ClientsMap {
private static ArrayListMultimap<Integer, String> multimapCardNumber = ArrayListMultimap.create();
...
public static void addCardNumber(String cardNumberValue) {
multimapCardNumber.put(multimapCardNumber.size(), cardNumberValue);
}
public static String returnSpecificCardNumber(int specificCardNumberPosition) {
String returnedCardNumber = multimapCardNumber.get(specificCardNumberPosition - 1).get(0);
return returnedCardNumber;
}
}
Затем я создал некоторые конкретные ключевые слова, которые будут использоваться в предложениях, таких как:
And I want to make a card transaction with this parameters:
| XXX | 9999 |
| accountNumber | account1-client1 |
| cardNumber | cardNumber1 |
Затем у меня есть метод, который проверяет ключевые слова, такие как "cardNumber", и получает положение карты следующим образом:
if (paramsList[i].startsWith("cardNumber")) {
String cardNumberPosition = paramsList[i].replaceAll("[^0-9]", "");
paramsList[i] = returnSpecificCardNumber(Integer.valueOf(cardNumberPosition));
}
И после каждого сценария не забудьте удалить карту.
Разделение состояния между шагами, как я понимаю ваш вопрос, не выполняется путем проверки возвращаемого значения. Это делается путем установки значения в переменной экземпляра и последующего чтения этой переменной экземпляра на другом шаге.
Я бы изменил ваши шаги на это, чтобы добиться этого:
public class CreateClientSteps {
private String clientID;
private String orderID;
@Given("^I create client type: \"([^\"]*)\"$")
public void iCreateClient(String clientType) {
System.out.println(clientType);
try {
clientID = util.createClient(clientType);
} catch (IOException e) {
e.printStackTrace();
}
}
@And("^I create for client: \"([^\"]*)\" an account type \"([^\"]*)\"$")
public void createAccount(String clientID, String accountType) {
try {
orderID = util.createAccount(clientID, accountType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вещи, которые я изменил,
- Два поля для общего состояния - другие шаги могут прочитать значения позже
- Нестатические методы - Cucumber воссоздает класс шагов для каждого сценария, поэтому я не хочу, чтобы поля были статичными, поскольку это означало бы, что их значения будут просачиваться между сценариями
Так вы делите состояние между шагами в одном классе. Совместное использование состояния между шагами в разных классах также может быть сделано. Это немного сложнее. Спросите, если вы заинтересованы.