首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在测试时重写Scala Guice中的TypeLiteral

如何在测试时重写Scala Guice中的TypeLiteral
EN

Stack Overflow用户
提问于 2019-06-21 01:48:50
回答 1查看 216关注 0票数 1

在我的Module.scala中,我绑定了一个如下定义的特征的具体实现:

代码语言:javascript
复制
trait AccessGroupRepository[F[_]] {}

@Singleton
class AccessGroupRepositoryImpl @Inject()(db: OldDataBase, c: IOContextShift)
    extends AccessGroupRepository[IO] {}

并且绑定是使用TypeLiteral完成的

代码语言:javascript
复制
bind(new TypeLiteral[AccessGroupRepository[IO]] {}).to(classOf[AccessGroupRepositoryImpl])

现在,在使用Mockito模拟进行测试时,我需要覆盖此绑定:

代码语言:javascript
复制
override val application: Application = guiceApplicationBuilder
    .overrides(bind(new TypeLiteral[AccessGroupRepository[IO]] {}).to(agRepoMock))

但我得到以下错误:

代码语言:javascript
复制
overloaded method value bind with alternatives:
[error]   [T](implicit evidence$1: 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]                ^

我该怎么解决这个问题呢?

此问题与How to bind a class that extends a Trait with a monadic type parameter using Scala Guice?相关

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-16 23:05:05

TypeLiteral在Play Guice API的scala实现中还不可用。

泛型的当前有效解决方案是使用所需的模拟定义创建一个测试模块,并将其传递到overrides

代码语言:javascript
复制
object CustomMockComponentModule extends AbstractModule {
  val agRepoMock = ...

  @Provides
  @Singleton
  def mockBean(): AccessGroupRepository[IO] = agRepoMock
}

...

override val application: Application = guiceApplicationBuilder
    .overrides(CustomMockComponentModule)
    .build()   
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56691398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档