io.cucumber.core.exception.CucumberException: не удалось преобразовать аргументы ... Похоже, вы не зарегистрировали тип таблицы данных - PullRequest
1 голос
/ 13 марта 2020

файл функции: Feature: Cucumber может преобразовать таблицу огурцов в карту.
Сценарий: международная кофейня должна обрабатывать валюты
С учетом прайс-листа международной кофейни

  | product | currency | price |
  | coffee  | EUR      | 1     |
  | donut   | SEK      | 18    |

Когда я покупаю 1 кофе и 1 пончик
Тогда я должен заплатить 1 евро и 18 шведских крон, есть часть кода:

@Given("^the price list for an international coffee shop$")
public void the_price_list_for_an_international_coffee_shop(List<Price> prices) throws Throwable {
    priceList = new HashMap<String, Price>();

    for (Price price : prices) {
        String key = price.getProduct();
        priceList.put(key, price);
    }
}

io.cucumber.core.exception .CucumberException: Не удалось преобразовать аргументы для шага [^ прайс-лист для международной кофейни $], определенного в 'hellocucumber.StepDefs_PriceList.the_price_list_for_an_international_coffee_shop (java .util.List)'. Похоже, вы не зарегистрировали тип таблицы данных. Подробности в трассировке стека ниже.

    <cucumber.version>5.4.1</cucumber.version>
    <junit.version>4.13</junit.version>

Я младший по огурцу. Не могли бы вы объяснить, что именно нужно изменить в коде?
Похоже, эта ошибка из-за новой версии 5 огурца, но очень непонятно, как заставить ее работать.
Спасибо.

1 Ответ

0 голосов
/ 13 марта 2020

Я предполагаю, что вы переходите с v1.x на v5.x.

В v1.x Cucumber автоматически конвертирует таблицы данных в POJO. Это было обработано внутри XStream. К сожалению, это привело к тесной связи между Cucumber и XStream.

Вместо этого, если вы хотите преобразовать таблицы данных в POJO, теперь вы должны предоставить свой собственный объектный преобразователь. Вы можете зарегистрировать одно для всех преобразований следующим образом:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import io.cucumber.java.DefaultDataTableCellTransformer;
import io.cucumber.java.DefaultDataTableEntryTransformer;
import io.cucumber.java.DefaultParameterTransformer;

import java.lang.reflect.Type;

public class StepDefinitions {

private final ObjectMapper objectMapper = 
   new ObjectMapper().registerModule(new JSR310Module());

    @DefaultParameterTransformer
    @DefaultDataTableEntryTransformer
    @DefaultDataTableCellTransformer
    public Object defaultTransformer(Object fromValue, Type toValueType) {
        JavaType javaType = objectMapper.constructType(toValueType);
        return objectMapper.convertValue(fromValue, javaType);
    }
} 

Примечание. В этом примере мы используем jackson-databind. Это не работает точно так же, как интеграция Cucumbers с XStream, но этого должно быть достаточно для большинства случаев использования.

Вы также можете преобразовать таблицу данных для указанного c java типа:

Given some authors
   | name            | first publication |
   | Aspiring Author |                   |
   | Ancient Author  | [blank]           |
package com.example.app;

import io.cucumber.java.DataTableType;
import io.cucumber.java.en.Given;

import java.util.List;

public class StepDefinitions {

    @DataTableType(replaceWithEmptyString = "[blank]")
    public Author convert(Map<String, String> entry){
      return new Author(
         entry.get("name"),
         entry.get("first publication")
      );
    }

    @Given("some authors")
    public void given_some_authors(List<Author> authors){
      // authors = [Author(name="Aspiring Author", firstPublication=null), 
      //              Author(name="Ancient Author", firstPublication=)]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...