BlazeClientBuilder [IO]的嘲笑返回模拟客户端[IO]

问题描述 投票:0回答:1

我现在用的是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
scala mockito scala-cats io-monad
1个回答
2
投票

看来你只需要像做

val resourceMock = mock[Resource[IO, Client[IO]]]
//stub whatever is necessary
val call = new ExternalCall(resourceMock).retrieveData
//do asserts and verifications as needed

编辑:

您可以在下面看到一个完全工作的例子,但我想强调的是,这是为什么它是一个很好的做法,以避免嘲笑,你没有自己的API一个很好的例子。

一个更好的办法来测试这将是把相关的代码witin你拥有一个类(YourHttpClient或其他)的http4s写为类,检查该http4s客户做正确的事(可以使用wiremock模拟的集成测试真正的HTTP服务器)。

然后,你可以通过YourHttpClient的嘲笑到依赖于它的组件,与你控制它的API,因此这将是利用简单,如果http4s不断更新它的API你只有一个破类,而不是修复数十或数百个模拟互动。

顺便说一句,这个例子用的Mockito - 斯卡拉作为使用的的Mockito Java版本将有产生的代码更难读取写入。

    val resourceMock = mock[Resource[IO, Client[IO]]]
    val clientMock   = mock[Client[IO]]
    val response: Response[IO] = Response(Status.Ok,
                                          body = Stream("Mocked!!!").through(text.utf8Encode),
                                          headers = Headers(`Content-Type`(MediaType.text.plain, Charset.`UTF-8`)))

    clientMock.fetch[String](any[Request[IO]])(*) shouldAnswer { (_: Request[IO], f: Response[IO] => IO[String]) =>
      f(response)
    }

    resourceMock.use[String](*)(*) shouldAnswer { (f: Client[IO] => IO[String]) =>
      f(clientMock)
    }

    val data = new ExternalCall(resourceMock, Uri.unsafeFromString("http://www.example.com")).retrieveData

    data.unsafeRunSync().right.value shouldBe "Mocked!!!"
© www.soinside.com 2019 - 2024. All rights reserved.