Дразнить сервис, который возвращает кошек EitherT с Guice и MockitoSugar - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь написать несколько функциональных тестов и хочу смоделировать сервис, который использует внешнего поставщика. Но я не могу настроить макет для функций, которые возвращают 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(

Я только хочу высказать удачный ответ, потому что это то, что я тестирую. Есть ли способ сделать это?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

С 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, для автоматического сброса перед каждым тестом..

Проверьте здесь для более подробной информации

2 голосов
/ 16 мая 2019

Попробуйте помочь компилятору, предоставив некоторые параметры типа для rightT, например,

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

вместо

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