文档

§使用 Guice 进行测试

如果您使用 Guice 进行 依赖注入,那么您可以直接配置组件和应用程序的创建方式以进行测试。这包括添加额外的绑定或覆盖现有绑定。

§GuiceApplicationBuilder

GuiceApplicationBuilder 提供了一个构建器 API,用于配置依赖注入和 Application 的创建。

§环境

可以指定 环境 或环境的某些部分,例如应用程序的根路径、模式或类加载器。配置的环境将用于加载应用程序配置,它将在加载模块时使用,并在从 Play 模块派生绑定时传递,并且它将可注入到其他组件中。

import play.api.inject.guice.GuiceApplicationBuilder
val application = new GuiceApplicationBuilder()
  .load(
    new play.api.inject.BuiltinModule,
    new play.api.i18n.I18nModule,
    new play.api.mvc.CookiesModule
  .in(Environment(new File("path/to/app"), classLoader, Mode.Test))
  .build()
val application = new GuiceApplicationBuilder()
  .load(
    new play.api.inject.BuiltinModule,
    new play.api.i18n.I18nModule,
    new play.api.mvc.CookiesModule
  .in(new File("path/to/app"))
  .in(Mode.Test)
  .in(classLoader)
  .build()

§配置

可以添加额外的配置。此配置将始终添加到为应用程序自动加载的配置中。当使用现有键时,将优先使用新配置。

val application = new GuiceApplicationBuilder()
  .configure(Configuration("a" -> 1))
  .configure(Map("b" -> 2, "c" -> "three"))
  .configure("d" -> 4, "e" -> "five")
  .build()

还可以覆盖从应用程序环境自动加载配置。这将完全替换应用程序配置。例如

val application = new GuiceApplicationBuilder()
  .loadConfig(env => Configuration.load(env))
  .build()

§绑定和模块

用于依赖注入的绑定是完全可配置的。构建器方法支持 Play 模块和绑定 以及 Guice 模块。

§附加绑定

可以通过 Play 模块、Play 绑定或 Guice 模块添加附加绑定。

import play.api.inject.bind
val injector = new GuiceApplicationBuilder()
  .bindings(new ComponentModule)
  .bindings(bind[Component].to[DefaultComponent])
  .injector()

§覆盖绑定

可以使用 Play 绑定或提供绑定的模块来覆盖绑定。例如

val application = new GuiceApplicationBuilder()
  .overrides(bind[Component].to[MockComponent])
  .build()

§禁用模块

可以通过类名禁用任何加载的模块。

val injector = new GuiceApplicationBuilder()
  .disable[ComponentModule]
  .injector()

§加载的模块

模块会根据 play.modules.enabled 配置自动从类路径加载。可以覆盖此默认模块加载。例如

val injector = new GuiceApplicationBuilder()
  .load(
    new play.api.inject.BuiltinModule,
    new play.api.i18n.I18nModule,
    new play.api.mvc.CookiesModule,
    bind[Component].to[DefaultComponent]
  )
  .injector()

§GuiceInjectorBuilder

GuiceInjectorBuilder 提供了一个构建器 API,用于更一般地配置 Guice 依赖注入。此构建器不会像 GuiceApplicationBuilder 一样自动从环境加载配置或模块,而是提供一个完全干净的状态来添加配置和绑定。这两个构建器的通用接口可以在 GuiceBuilder 中找到。将创建一个 Play Injector。以下是如何使用注入器构建器实例化组件的示例

import play.api.inject.guice.GuiceInjectorBuilder
import play.api.inject.bind
val injector = new GuiceInjectorBuilder()
  .configure("key" -> "value")
  .bindings(new ComponentModule)
  .overrides(bind[Component].to[MockComponent])
  .injector()

val component = injector.instanceOf[Component]

§在功能测试中覆盖绑定

以下是用模拟组件替换组件以进行测试的完整示例。让我们从一个具有默认实现和模拟实现的组件开始

trait Component {
  def hello: String
}

class DefaultComponent extends Component {
  def hello = "default"
}

class MockComponent extends Component {
  def hello = "mock"
}

此组件使用模块自动加载

import play.api.inject.Binding
import play.api.inject.Module
import play.api.Configuration
import play.api.Environment

class ComponentModule extends Module {
  def bindings(env: Environment, conf: Configuration): Seq[Binding[_]] = Seq(
    bind[Component].to[DefaultComponent]
  )
}

该组件在控制器中使用

import javax.inject.Inject

import play.api.mvc._

class Application @Inject() (component: Component, cc: ControllerComponents) extends AbstractController(cc) {
  def index = Action {
    Ok(component.hello)
  }
}

要构建一个在功能测试中使用的 Application,我们可以简单地覆盖组件的绑定

import play.api.inject.guice.GuiceApplicationBuilder
import play.api.inject.bind
val application = new GuiceApplicationBuilder()
  .overrides(bind[Component].to[MockComponent])
  .build()

创建的应用程序可以与 Specs2ScalaTest 的功能测试助手一起使用。

下一步:使用编译时依赖注入进行测试


发现此文档中的错误?此页面的源代码可以在 此处 找到。在阅读 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛 与社区开始对话。