代码之家  ›  专栏  ›  技术社区  ›  agusgambina

用Guice和MockitoSugar模拟一个返回Cats EitherT的服务

  •  0
  • agusgambina  · 技术社区  · 5 年前

    我试图编写一些功能测试,我想模拟一个使用外部提供者的服务。但是我不能为返回的函数设置mock 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(
    

    我只想嘲笑成功的回应,因为这是我正在测试的。有办法吗?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Mario Galic    5 年前

    尝试通过提供一些类型参数来帮助编译器 rightT 像这样

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

    而不是

    EitherT.rightT(Json.parse("""{"key": "value"}"""))
    
        2
  •  3
  •   ultrasecr.eth    5 年前

    用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 fake应用程序中的所有模拟都自动重置。

    支票 here 更多细节