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

Так вы делите состояние между шагами в одном классе. Совместное использование состояния между шагами в разных классах также может быть сделано. Это немного сложнее. Спросите, если вы заинтересованы.

Другие вопросы по тегам