嘲笑用Guice和Mockitosugar返回Cats Eithert的服务



我正在尝试编写一些功能测试,我想模拟一个消耗外部提供商的服务。但是我无法为返回EitherT

的功能设置模拟

这是其实施的特征

@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]

然后,当我尝试模拟成功的响应

  "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(S(以使此工作顺利进行。

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

在此处查看更多详细信息

尝试通过向 rightT提供某种类型的参数来帮助编译器,例如so

EitherT.rightT[Future, String](Json.parse("""{"key": "value"}"""))

而不是

EitherT.rightT(Json.parse("""{"key": "value"}"""))

相关内容

  • 没有找到相关文章

最新更新