在Play中重写Guice绑定

我正在为一个Play应用程序编写一些单元测试,其中我想重写在应用程序的Guice模块中建立的一些绑定。 在我看来,Play文档中有一些关于覆盖的 假设 ,我想知道它们是什么。

它说:https://www.playframework.com/documentation/2.6.x/ScalaTestingWithGuice

绑定可以使用Play绑定或提供绑定的模块覆盖 。 例如: val application = new GuiceApplicationBuilder() .overrides(bind[Component].to[MockComponent]) .build()

这是我写作的测试的开始; 您可能会识别出Silhouette授权库的各个部分:

class FakeOatApplicationsSpec extends OatSpec with GuiceOneAppPerSuite {

  private val user = UserFakes.advisor

  override def fakeApplication(): Application = new GuiceApplicationBuilder()
    .overrides(
      bind[AuthenticatorService[CookieAuthenticator]].to[FakeCookieAuthenticatorService],
      bind[UserService].to[FakeUserServiceImpl],
      bind[UserIdentity].toInstance(user)
    ).build()

测试直接通过检查注入的类。 这一个确保喷射器返回预期类型的​​对象并且该对象具有预期的行为。

"should inject the overridden CookieAuthenticator" in {
  val injectAuth = app.injector.instanceOf[AuthenticatorService[CookieAuthenticator]]
  assertResult("oat.server.test.FakeCookieAuthenticatorService") {injectAuth.getClass.getName}
  val cookieAuth = await {injectAuth.retrieve(FakeRequest())}
  assertResult(user.userid.toString) {cookieAuth.get.loginInfo.providerKey}
}

但是,如果我得到一个注入的控制器并在那里寻找预期的行为,则测试失败。 特别是,我期望的行为是控制器的Request对象中嵌入了注入用户。 我实际上看到的用户是来自应用程序的模块绑定中被推翻的CookieAuthenticator。 所以在某些情况下,忽略忽略。

在应用程序的模块中, AuthenticatorService[CookieAuthenticator]@Provides函数提供。 我不知道这是否有所作为。

此外,我注意到注入器将提供某些类型的对象,但不提供其他类型的对象。 例如, app.injector.instanceOf[FakeController]提供了预期的对象。 它使用@Inject()注释。 app.injector.instanceOf[UserDAO]成功。 它绑定在应用程序的模块中。 但app.injector.instanceOf[Silhouette[OatEnv]]失败,并显示“没有实现com.mohiva.play.silhouette.api.Silhouette被绑定”。 错误。 但是Guice必须知道它,因为它被注入到它快乐地返回的FakeController 。 该绑定是应用程序模块中的第一个:

class ServerModule(environment: play.api.Environment,
                   configuration: Configuration
                  ) extends AbstractModule with ScalaModule with Logger {

  def configure() {
    bind[Silhouette[OatEnv]].to[SilhouetteProvider[OatEnv]]    // injector fails
    bind[UserDAO].to[UserDAOAnormImpl]                         // injector works
    ...

Play Framework 2.4.x中提供了一个类似的(未答复的)问题 - 覆盖Guice绑定。 Guice谷歌集团(https://groups.google.com/forum/#!topic/google-guice/naqT-fOrOTw)2011年发布的一篇文章中提到了“儿童注射器”中的重写以及Guice,设计,不允许它。 这是我的情况吗? 我没有在当前的Play文档或当前的Guice文档中看到任何有关“儿童注射器”的提及。

那么,总而言之,哪种覆盖是允许的,哪些不是? 为什么我可以从注射器中获得一些物体而不是其他物体?

链接地址: http://www.djcxy.com/p/94655.html

上一篇: Overriding Guice bindings in Play

下一篇: Inject a Hibernate Interceptor with Guice / GuicePersist