在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