在我的<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的类?
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什么吗?我需要自动连线吗? 谢谢!