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