测试高阶函数 scala + 猫资源



>我有一个问题。我将以下函数与 Scala cats 库一起使用。

def process(
client: Resource[IO, HttpClient] = HttpClientFactory.createClient()
): IO[Long] =
client.use(httpClient => {
for {
files <- IO { getFiles() }
placeMarkers <- IO { sendFile(client) }
} yield placeMarkers
})

现在我想用单元测试来测试这段代码,我想模拟 httpClient。 我正在尝试这样的事情,但它不起作用:

val resourceIOMock = mock[Resource[IO, HttpClient]]
val httpMock = mock[HttpClient]
doReturn(httpMock).when(resourceIOMock).use(any())

这不起作用,因为数学家 any((。我真的不知道如何将我的模拟传递到那里,然后可以根据需要进行配置。据我所知,代码永远不会进入 for 循环。 有人可以帮忙吗? 感谢

为什么你需要嘲笑Resource?你几乎可以做这样的事情:

// given
val client = mock[HttpClient]
val clientResource = Resource.make[IO, HttpClient](IO.pure(client))(_ => IO.unit)
doReturn(client).when(methodUsedInTest).use(...)
// when
val result = process(clientResource).runSync
// then
assert(...)

如果你使用 IO构建纯值,那么当你有一个非常好的工厂方法时,对它们使用模拟是没有意义的,特别是因为 IO 是数据 - 当你创建这些值时它们不会产生副作用,只有当你解释它时(你不能对每个随机的 Java 类都这么说(。

因此,模拟IO,资源,引用与模拟案例类或列表/选项/矢量/集合/容器一样没有意义。如果您将函数作为参数传递,则相同 - 如果可以只传递实现,为什么要嘲笑?资源只是一对acquirerelease函数。您可以比 mockito 更快地实现它们。

最新更新