【发布时间】:2019-07-02 10:34:22
【问题描述】:
我正在使用BlazeClientBuilder[IO].resource 方法获取Client[IO]。现在,我想模拟客户端进行单元测试,但不知道该怎么做。有没有一种很好的方法来模拟这个,我该怎么做?
class ExternalCall(val resource: Resource[IO, Client[IO]], externalServiceUrl: Uri) {
def retrieveData: IO[Either[Throwable, String]] = {
for {
req <- IO(Request[IO](Method.GET, uri = externalServiceUrl))
response <- resource.use(client => {
client.fetch[String](req)(httpResponse => {
if (!httpResponse.status.isSuccess)
throw new Exception(httpResponse.status.reason)
else
httpResponse.as[String]
})
})
} yield Right(response)
}
}
来电代码
new ExternalCall(BlazeClientBuilder[IO](global).resource).retrieveData
【问题讨论】:
-
您究竟为什么要这样做?模拟本身不应该是一个目标——它是一种旨在帮助隔离某些组件以进行测试的工具。有可能(甚至可能)有更好的方法来编写这些测试。
-
我正在使用http4sclient使用builder获取外部数据,现在我想模拟外部数据以测试各种场景。
-
你能提供一个关于你如何注入和使用
BlazeClientBuilder[IO].resource的代码的sn-p吗? -
添加代码sn-p
-
你将如何存根(而不是模拟)为任何请求返回硬编码响应?
标签: scala mockito scala-cats io-monad