Scala: Как выполнить модульное тестирование функции, которая у меня есть, которая делает вызов API с помощью mock / stub? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть функция, которая делает вызов API для внешнего API

Допустим, функция выполняет нечто простое, как показано ниже.К вашему сведению, необходимо импортировать scala.io.Source

  def myFunction(apiRequestUrl: String) : MyObject = {
    val response: String = Source.fromURL(apiRequestUrl).mkString
    val formatedResponse: MyObject = formatResponseFunction(response)
    formatedResponse
  }

Я знаю, что некоторые коды ошибок, которые я могу получить, это 400, 404 и т. Д. ... и я хотел бы просто обработать любой код ошибки в общем из этого.Как это можно сделать?Примеры, которые я нашел, похоже, тестируют собственный REST API, а не вызовы функций для чужого внешнего API

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Прежде всего, вы должны внедрить зависимости, которые вы хотите заменить на ложные, статические вызовы внутри функции не могут быть смоделированы / заглушки

В вашем сценарии у вас есть другая проблема: ваша зависимостьSource - это объект, и вы не можете высмеивать объекты, только не финальные классы и черты.Кроме того, считается плохой практикой издеваться над сторонними API ...

Хороший способ решить все эти проблемы - переписать код, например

trait HttpAdapter {
  def fromUrl(apiRequestUrl: String): String = Source.fromURL(apiRequestUrl).mkString
}

object HttpAdapter extends HttpAdapter

def myFunction(apiRequestUrl: String, httpAdapter: HttpAdapter = HttpAdapter) : MyObject = {
  val response: String = httpAdapter.fromUrl(apiRequestUrl)
  val formatedResponse: MyObject = formatResponseFunction(response)
  formatedResponse
}

"myFunction" should "work" in {
  //create mock
  val http = mock[HttpAdapter]

  //stub mock
  http.fromUrl("some url") shouldReturn "result"

  //inject mock
  myFunction("some url", http) shouldBe MyObject
}

Notice I 'я завернул сторонний API в класс, над которым у меня полный контроль (HttpAdapter), а затем я высмеиваю этот

Затем я вставляю httpAdapter в качестве параметра, но я предоставляю значение по умолчанию, чтобы вызывающие абонентыне нужно беспокоиться об этом, хотя я все еще могу переопределить его с помощью макета или заглушки в тестовом коде

Также обратите внимание, что я использую mockito-scala вместо обычного mockito, поэтому синтаксис заглушки отличается

0 голосов
/ 15 ноября 2018

Для подделки вызовов внешних сервисов вы можете использовать Mockito, который является фреймворком.Mockito очень прост в использовании, и вы можете предоставить заглушки для ваших внешних вызовов.Например,

val m = mock[io.Source.type]

Здесь вы издеваетесь над источником, а затем задаете желаемое поведение при вызове функции fromUrl.т.е.

when(m.fromUrl("external service url")) thenReturn("result")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...