gpt4 book ai didi

scala - 使用 Guice 和 MockitoSugar 模拟返回 Cats EitherT 的服务

转载 作者:行者123 更新时间:2023-12-05 01:10:02 25 4
gpt4 key购买 nike

我正在尝试编写一些功能测试,并且我想模拟使用外部提供程序的服务。但我无法为返回 EitherT

的函数设置模拟

这是其实现调用外部服务的 Trait

@ImplementedBy(classOf[ExternalServiceImpl])
trait ExternalService {
def index: EitherT[Future, String, JsValue]
}

在我设置的 CustomAppPerSuite 特征中

val mockExternalService = mock[ExternalService]

implicit override lazy val app = new GuiceApplicationBuilder()
.in(Mode.Test)
.overrides(bind[ExternalService].toInstance(mockExternalService))
.build()

val externalService = app.injector.instanceOf[ExternalService]

然后当我尝试 mock 成功的响应时

  "ExternalController#index" should {

"return index data" in {
doReturn(EitherT.rightT(Json.parse("""{"key": "value"}""")).when(externalService).index
val fakeRequest = FakeRequest(GET, "/api/external")
val result = externalController.index().apply(fakeRequest)
status(result) mustBe OK
}

但我收到此错误

[error]  found   : cats.data.EitherT[cats.package.Id,Nothing,JsValue]
[error] required: cats.data.EitherT[scala.concurrent.Future,String,JsValue]
[error] def index = EitherT.rightT(

我只想模拟成功的响应,因为这是我正在测试的。有办法做到这一点吗?

最佳答案

使用mockito-scala-cats,你可以用更简洁的方式编写它

Json.parse("""{"key": "value"}""") willBe returnedF by externalService.index
//or
externalService.index shouldReturnF Json.parse("""{"key": "value"}""")

该库将查看 externalService.index 的返回类型并获取适当的 cats.Applicative 以使此工作顺利进行。

如果您在 Scalatest 上运行,另一个优势是您可以混合 ResetMocksAfterEachTest 并让您连接到 play fake 应用程序的所有模拟在每次测试之前自动重置。

检查here了解更多详情

关于scala - 使用 Guice 和 MockitoSugar 模拟返回 Cats EitherT 的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56170817/

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