使用 Guice 和 MockitoSugar 模拟 returns Cats EitherT 的服务
Mocking a Service that returns Cats EitherT with Guice and MockitoSugar
我正在尝试编写一些功能测试,我想模拟一个使用外部提供程序的服务。但是我无法为 return EitherT
的功能设置模拟
这是实现调用外部服务的Trait
@ImplementedBy(classOf[ExternalServiceImpl])
trait ExternalService {
def index: EitherT[Future, String, JsValue]
}
在我设置的 CustomAppPerSuite trait 中
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(
我只想模拟成功的响应,因为这是我正在测试的。有办法吗?
尝试通过向 rightT
提供一些类型参数来帮助编译器,就像这样
EitherT.rightT[Future, String](Json.parse("""{"key": "value"}"""))
而不是
EitherT.rightT(Json.parse("""{"key": "value"}"""))
有了 mockito-scala-cats 你可以用更简洁的方式写出来
Json.parse("""{"key": "value"}""") willBe returnedF by externalService.index
//or
externalService.index shouldReturnF Json.parse("""{"key": "value"}""")
库将查看 externalService.index
的 return 类型并获得适当的 cats.Applicative
(s) 以使这项工作顺利进行。
如果您 运行 在 Scalatest 上,另一个优势是您可以 mix-in ResetMocksAfterEachTest
并让您连接到 play fake 应用程序的所有模拟在每个之前自动重置测试。
查看here了解更多详情
我正在尝试编写一些功能测试,我想模拟一个使用外部提供程序的服务。但是我无法为 return EitherT
这是实现调用外部服务的Trait
@ImplementedBy(classOf[ExternalServiceImpl])
trait ExternalService {
def index: EitherT[Future, String, JsValue]
}
在我设置的 CustomAppPerSuite trait 中
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(
我只想模拟成功的响应,因为这是我正在测试的。有办法吗?
尝试通过向 rightT
提供一些类型参数来帮助编译器,就像这样
EitherT.rightT[Future, String](Json.parse("""{"key": "value"}"""))
而不是
EitherT.rightT(Json.parse("""{"key": "value"}"""))
有了 mockito-scala-cats 你可以用更简洁的方式写出来
Json.parse("""{"key": "value"}""") willBe returnedF by externalService.index
//or
externalService.index shouldReturnF Json.parse("""{"key": "value"}""")
库将查看 externalService.index
的 return 类型并获得适当的 cats.Applicative
(s) 以使这项工作顺利进行。
如果您 运行 在 Scalatest 上,另一个优势是您可以 mix-in ResetMocksAfterEachTest
并让您连接到 play fake 应用程序的所有模拟在每个之前自动重置测试。
查看here了解更多详情