Тест Spring Boot + Cucumber: огурец не может определить мой метод определения шага из-за экранирования двойных кавычек в JSON - PullRequest
0 голосов
/ 28 августа 2018

В приложении Spring Boot REST я хочу проверить с помощью Cucumber-jvm, что возвращаемый JSON - это именно то, что я ожидаю. Однако, поскольку мне приходится использовать двойные кавычки вокруг имен ключей JSON, Cucumber не может определить правильный метод определения шага и, следовательно, тест не может пройти.

Вот ожидаемый результат JSON:

{"fields":[],"errorMsg":"BIN not found"}

Определение шага огурца:

Given bin number is <bin>
When binlookup searches with this bin number
Then binlookup returns <result> and status code <code>

Examples: 
  | bin      | result                                                       | code |
  | "222222" | "{\"fields\":[\"bin\"]\,\"errorMsg\":\"Invalid Argument\"}"   | 404  |

Соответствующий метод:

@Then("^binlookup returns \"([^\"]*)\" and status code \\d$")
public void binlookup_returns_and_status_code(String result, Integer code) throws Exception {
    assertThat(this.results.getResponse().getContentType()).isEqualTo(MediaType.APPLICATION_JSON_UTF8_VALUE);
    assertThat(this.results.getResponse().getStatus()).isEqualTo(code);
    assertThat(this.results.getResponse().getContentAsString().length()).isNotEqualTo(0);
    assertThat(this.results.getResponse().getContentAsString()).isEqualTo(result);
}

При запуске теста у меня правильно вернул JSON:

{"fields":["bin"],"errorMsg":"Invalid Argument"}

Но я вижу ошибки теста, и Cucumber не может определить мой метод, и дает мне такие советы, как:

You can implement missing steps with the snippets below:

@Then("binlookup returns {string}\\:[],\\{string}\\:\\{string} and status code {int}")
public void binlookup_returns_and_status_code(String string, String string2, String string3, Integer int1) {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

Очевидно, он связывает первый " с первым экранированным " и видит {\"fields в качестве первого параметра, но это неверно.

Но я не могу заключить в кавычки строку JSON с ' ', потому что это не будет иметь место.

Что я могу сделать?

<Ч />

Если это невозможно, как я могу убедиться, что в JSON есть ожидаемые данные?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Сегодня я где-то читал, что отныне регулярные выражения будут устаревшими (причина неизвестна), и они переходят к выражению огурца. Я с Cucumber 3.0.2, где доступно выражение Cucumber. Так что я попробовал это, и вдруг все теперь хорошо.

Я также заметил, что у меня есть некоторые ошибки в OP, и я тоже их исправил.

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

Теперь у меня есть:

Examples: 
  | bin      | result                                                       | code |
  | "222222" | '{"fields":[],"errorMsg":"BIN not found"}'                   | 404  |

И метод аннотируется как:

@Then("binlookup returns {string} and status code {int}")
public void binlookup_returns_and_status_code(String result, Integer code) throws Exception {
    ...

(обратите внимание, что регулярное выражение не может сосуществовать с выражением огурца; ^ и $, а другие могут вызвать ошибку синтаксического анализа в выражении огурца)

И я могу пройти все испытания. По крайней мере, в Eclipse. В IntelliJ я не знаю.

...
Then binlookup returns '{"fields":[],"errorMsg":"BIN not found"}' and status code 404 # BinInfoControllerCucumberTests.binlookup_returns_and_status_code(String,Integer)

Вы видите, что метод найден. До этого был null (не может быть найден).

Одиночная кавычка + выражение регулярного выражения не работает.

Помните : в строке просто экранируйте символ, который вы используете, чтобы заключить всю строку, которая может быть одинарной или двойной кавычкой.

0 голосов
/ 28 августа 2018

Stepdefs огурца это все о регулярных выражениях. Аргументы записываются с помощью групп захвата, вам нужно использовать только регулярное выражение, соответствующее json.

Я думаю, что это сработало бы для вас:

@Then("^binlookup returns \"(.*)\" and status code \\d$")

Регулярное выражение \ "(. *) \" Захватит все, что находится в двойных кавычках.

Полное регулярное выражение: "binlookup возвращает" , за которым следует все в двойных кавычках (регулярное выражение \ "(. *) \"), Затем "и код состояния" , за которым следует число (\ d регулярное выражение).

А в файле stepDef:

Examples: 
| bin      | result code |
| "222222" | "{"fields":["bin"],"errorMsg":"Invalid Argument"}"   | 404  |

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...