Гатлинг: преобразование поискаВсе в отсортированный список - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в scala и Гатлинге. Я пытаюсь преобразовать результат findAll в отсортированный список и затем вернуть String представление отсортированного списка. Я не могу сделать это со следующим кодом:

http(requestTitle)
  .post(serverUrl)
  .body(ElFileBody(sendMessageFile))
  .header("correlation-id", correlationId)
  .check(status.is(200),
    jsonPath("$.data.sendMessage.targetedRecipients").findAll.transform(recipients => {
      println("recipients class: " + recipients.getClass)
      var mutable = scala.collection.mutable.ListBuffer(recipients: _*)
      var sortedRecipients = mutable.sortWith(_ < _)
      println("users sorted "+ usersSorted)
      usersSorted.mkString(",")
  }).is(expectedMessageRecipients))

Получатели имеют тип scala .collection.immutable.Vector. Я думал, что смогу преобразовать неизменяемую коллекцию в изменяемую коллекцию, используя scala .collection.mutable.ListBuffer. Любая помощь будет оценена, спасибо.

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Я не думаю, что ваша проблема заключается в неизменности, это JSON анализ против методов Гатлинга .find и .findAll.

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

{"data":{"sendMessage":{"targetedRecipients":[1,4,2,3]}}}

, и в этом случае метод .findAll Гатлинга вернет вектор (он всегда это делает, если что-то найдет), но у него будет только один элемент, который будет "[1,4,2,3] "- ie: строка, представляющая данные json, поэтому сортировка коллекции одного элемента, естественно, ничего не дает. Чтобы заставить .findAll вести себя так, как вы, похоже, ожидаете, вам понадобится что-то вроде ...

{"data":
 {"sendMessage":
  {"targetedRecipients":
    [{"recipientId":1},
     {"recipientId":4},
     {"recipientId":2},
     {"recipientId":3}]
 }}}

, которое вы можете использовать .jsonPath("$..recipientId").findAll, чтобы превратить в вектор [String] идентификаторов .

Таким образом, предполагая, что вы действительно получаете только одно строковое представление массива значений, вы можете использовать прямое преобразование для генерации массива и сортировки (как вы пытались в своем примере)

Вот рабочая версия

val data = """{"data":{"sendMessage":{"targetedRecipients":[1,4,2,3]}}}"""

def sortedArray : ScenarioBuilder = scenario("sorting an array")
.exec(http("test call")
.post("http://httpbin.org/anything")
.body(StringBody(data)).asJson
.check(
  status.is(200),
  jsonPath("$.json.data.sendMessage.targetedRecipients")
    .find
    .transform(_
      .drop(1)
      .dropRight(1)
      .split(",")
      .toVector
      .sortWith(_<_)
    )
    .saveAs("received")
))
.exec(session => {
  println(s"received: ${session("received").as[Vector[String]]}")
  session
})
0 голосов
/ 26 марта 2020

Нет смысла использовать изменяемую коллекцию, если все, что вам нужно, это отсортировать результат:

Vector(5,4,3,2,1).sortWith(_ < _).mkString(", ") // "1, 2, 3, 4, 5"

Чтобы использовать ListBuffer, вы должны скопировать все элементы во вновь выделенный объект, так что это не ' т еще более оптимальным в любом случае. То же самое с var s - вы можете использовать val s, поскольку вы не обновляете ссылку

println(s"recipients class: ${recipients.getClass}")
val result = recipients.sortWith(_ < _).mkString(", ")
println(s"users sorted $result")
result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...