gpt4 book ai didi

scala - 模拟 BlazeClientBuilder[IO] 以返回模拟客户端 [IO]

转载 作者:行者123 更新时间:2023-12-04 13:01:59 27 4
gpt4 key购买 nike

我正在使用 BlazeClientBuilder[IO].resource获取方法 Client[IO] .现在,我想模拟客户端进行单元测试,但不知道该怎么做。有没有 mock 这个的好方法,我将如何做到这一点?

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

最佳答案

看来你只需要做类似的事情

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

编辑:

您可以在下面看到一个完整的示例,但我想强调的是,这是一个很好的示例,说明为什么避免模拟您不拥有的 API 是一种很好的做法。

测试这一点的更好方法是将 http4s 相关代码放在您拥有的类( YourHttpClient 或其他)中,并为该类编写集成测试以检查 http4s 客户端是否正确执行(您可以使用 wiremock模拟真实的http服务器)。

然后你可以通过模拟 YourHttpClient对于依赖于它的组件,优势在于你可以控制它的 API,所以它会更简单,如果 http4s 更新它的 API,你只有一个破坏类,而不必修复数十或数百个模拟交互。

顺便说一句,该示例是使用 mockito-scala 编写的,因为使用 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!!!"

关于scala - 模拟 BlazeClientBuilder[IO] 以返回模拟客户端 [IO],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com