测试时如何在 Scala Guice 中覆盖 TypeLiteral
How to override a TypeLiteral in Scala Guice when testing
在我的 Module.scala
中,我绑定了一个特征的具体实现,定义如下:
trait AccessGroupRepository[F[_]] {}
@Singleton
class AccessGroupRepositoryImpl @Inject()(db: OldDataBase, c: IOContextShift)
extends AccessGroupRepository[IO] {}
并使用 TypeLiteral
:
完成绑定
bind(new TypeLiteral[AccessGroupRepository[IO]] {}).to(classOf[AccessGroupRepositoryImpl])
现在,我需要在使用 Mockito 模拟测试时覆盖此绑定:
override val application: Application = guiceApplicationBuilder
.overrides(bind(new TypeLiteral[AccessGroupRepository[IO]] {}).to(agRepoMock))
但我收到以下错误:
overloaded method value bind with alternatives:
[error] [T](implicit evidence: scala.reflect.ClassTag[T])play.api.inject.BindingKey[T] <and>
[error] [T](clazz: Class[T])play.api.inject.BindingKey[T]
[error] cannot be applied to (com.google.inject.TypeLiteral[api.v1.accessgroup.AccessGroupRepository[cats.effect.IO]])
[error] .overrides(bind(repoTypeLiteral).to(agRepoMock))
[error] ^
我该如何解决?
此问题涉及
TypeLiteral
在 Play Guice 的 Scala 实现中尚不可用 API。
当前有效的泛型解决方案是创建一个具有所需模拟定义的测试模块,并在 overrides
:
中传递它
object CustomMockComponentModule extends AbstractModule {
val agRepoMock = ...
@Provides
@Singleton
def mockBean(): AccessGroupRepository[IO] = agRepoMock
}
...
override val application: Application = guiceApplicationBuilder
.overrides(CustomMockComponentModule)
.build()
在我的 Module.scala
中,我绑定了一个特征的具体实现,定义如下:
trait AccessGroupRepository[F[_]] {}
@Singleton
class AccessGroupRepositoryImpl @Inject()(db: OldDataBase, c: IOContextShift)
extends AccessGroupRepository[IO] {}
并使用 TypeLiteral
:
bind(new TypeLiteral[AccessGroupRepository[IO]] {}).to(classOf[AccessGroupRepositoryImpl])
现在,我需要在使用 Mockito 模拟测试时覆盖此绑定:
override val application: Application = guiceApplicationBuilder
.overrides(bind(new TypeLiteral[AccessGroupRepository[IO]] {}).to(agRepoMock))
但我收到以下错误:
overloaded method value bind with alternatives:
[error] [T](implicit evidence: scala.reflect.ClassTag[T])play.api.inject.BindingKey[T] <and>
[error] [T](clazz: Class[T])play.api.inject.BindingKey[T]
[error] cannot be applied to (com.google.inject.TypeLiteral[api.v1.accessgroup.AccessGroupRepository[cats.effect.IO]])
[error] .overrides(bind(repoTypeLiteral).to(agRepoMock))
[error] ^
我该如何解决?
此问题涉及
TypeLiteral
在 Play Guice 的 Scala 实现中尚不可用 API。
当前有效的泛型解决方案是创建一个具有所需模拟定义的测试模块,并在 overrides
:
object CustomMockComponentModule extends AbstractModule {
val agRepoMock = ...
@Provides
@Singleton
def mockBean(): AccessGroupRepository[IO] = agRepoMock
}
...
override val application: Application = guiceApplicationBuilder
.overrides(CustomMockComponentModule)
.build()