当前位置: 首页 > 知识库问答 >
问题:

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

詹弘毅
2023-03-14

在我的<code>模块中。scala我绑定了一个特性的具体实现,定义如下:

trait AccessGroupRepository[F[_]] {}

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

并且使用< code>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$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]                ^

我该如何解决这个问题?

这个问题涉及到如何使用Scala Guice绑定一个用一元类型参数扩展Trait的类?

共有1个答案

邹弘
2023-03-14

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

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

object CustomMockComponentModule extends AbstractModule {
  val agRepoMock = ...

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

...

override val application: Application = guiceApplicationBuilder
    .overrides(CustomMockComponentModule)
    .build()   

 类似资料:
  • 我有src/main/test/resources/application-test.yml,根据SpringBootTest,它将加载application.yml,然后加载application-test.yml。但是我面临这样一个场景:我只想重写一个测试中的application-test.yml中的某些属性,而其他测试需要使用application-test.yml中的属性。我该怎么做?

  • 我最终做的是在测试设置过程中替换应用程序级图(MockRestAdapter就是在其中创建的

  • 应用程序类文件: 集成测试:

  • 最后是MockRestTemplateConfiguration

  • 概要文件对于我所需要的似乎有点过分了,我不确定这是否可以通过主注释来实现,因为不同的单元测试可能有不同的模拟。

  • 我有一些集成测试是这样的: 和下面这样的测试: 我希望能够抵消时钟bean在一天的不同时间运行一些测试。我该怎么做? 但那里什么都没发生。我需要@import什么吗?我需要自动连线吗? 谢谢!