Это не такая большая проблема с FP, так как я не вижу никаких проблем с вашим кодом с точки зрения FP, но то, что вы должны сделать, по моему мнению, это использовать внедрение зависимостей, так что для тестирования вы может заменить тестовый класс на IO
, который имеет гарантированный ответ. Как то так:
abstract class IO {
def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String
}
class IOImpl extends IO {
def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = {
Http(link)
.param("access_token", apiKey)
.asString
.body
}
}
class IOTestImpl extends IO {
def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = ??? //some test HTML
}
А потом к вашим услугам:
class SongService(io: IO) {
private def retrieveSongId(songName: String): Option[JsValue] = {
val formattedSongName = songName.replace(" ", "%20")
val searchLink = "https://api.genius.com/search?q=" + formattedSongName
val geniusStringResponse = io.getHtmlFromWebsiteViaHttp(searchLink, apiKey)
//Extra processing on geniusStringResponse
}
}
Затем, когда вы создаете экземпляр SongService
, передайте его IOTestImpl
при тестировании и IOImpl
в противном случае. Вы можете найти соответствующую информацию о внедрении зависимостей и объектах доступа к базе данных .