如何使用Guice和模拟自定义ControllerComponents测试Play应用程序

时间:2019-06-12 11:20:59

标签: scala playframework guice

我已经开始构建新的Scala Play!应用程序,我想知道如何测试定义如下的控制器:

class CustomController @Inject()(
    cc: SecuredControllerComponents,
    clientResourceHandler: CustomResourceHandler
)(implicit ec: ExecutionContext)
    extends SecuredController(cc)

我需要模拟Guice自动注入的SecuredControllerComponents

case class SecuredControllerComponents @Inject()(
    adminActionBuilder: AdminActionBuilder,
    authenticatedActionBuilder: AuthenticatedActionBuilder,
    actionBuilder: DefaultActionBuilder,
    parsers: PlayBodyParsers,
    messagesApi: MessagesApi,
    langs: Langs,
    fileMimeTypes: FileMimeTypes,
    executionContext: scala.concurrent.ExecutionContext
) extends ControllerComponents

class SecuredController @Inject()(scc: SecuredControllerComponents)
    extends AbstractController(scc) {
  def AdminAction: AdminActionBuilder                       = scc.adminActionBuilder
  def AuthenticatedAction: AuthenticatedActionBuilder       = scc.authenticatedActionBuilder
}

Play的官方文档建议使用Helpers.stubControllerComponents()将组件传递到必须进行测试的Controller。

编辑-我要执行的测试

    "return a list of Custom Objects as a JSON array" in {
      val controller =
        new CustomController(Helpers.stubControllerComponents(), resourceHandler)
      val result: Future[Result] = controller.index().apply(FakeRequest())
      .....
      val bodyText: String       = contentAsString(result)
      bodyText mustBe "ok"

我已经完成this guide的有关使用Google Guice进行测试的工作,但是我不知道如何处理自定义SecuredComponentsCustomResourceHandler

能否请您指出正确的方向?有没有很好的例子值得关注?

我当前的配置

  • Scala v2.12.8
  • 播放2.7.2
  • Scala Guice 4.2.1
  • scalatestplus-play 4.0.2

1 个答案:

答案 0 :(得分:0)

我认为您现在需要做的就是模拟您的类,例如使用 Mockito

  new CustomController(mySecuredControllerComponentsMock, myCustomResourceHandlerMock)


 ...

 lazy val mySecuredControllerComponentsMock = {
  mock(SecuredControllerComponents.class)
  ...
}