在 Scala 中使用 Mockito 和 Guice 测试泛型接口
Using Mockito & Guice to test interfaces with generics in Scala
我是 Scala 的新手,当我尝试对我的一些接口进行单元测试时,我 运行 遇到了这个问题。
我有一个带方法的 InputService 特性
def poll(parameters: HashMap[String, String]): Option[T]
其中 T 是通用的,因此 InputService 有一个类型参数 [T]。
在我的模块中,我有
val inputService: InputService[String] = mock(classOf[InputService[String]])
bind[InputService[String]].toInstance(inputService)
在我的 InputServiceTest 中,我有
var inputService: InputService[String] = _
before {
inputService = Guice.createInjector(new MockWatcherModule).getInstance(classOf[InputService[String]])
}
但问题是当我 运行 它时,它给我这个错误
Exception encountered when invoking run on a nested suite - Guice configuration errors:
1) No implementation for services.InputService was bound.
while locating services.InputService
我认为是因为它正在寻找services.InputService来绑定,但它只有services.InputService[String]。但是,当我只使用 InputService 而不是 InputService[String] 时,我收到错误 Trait missing Type Parameter
.
有什么建议吗?
编辑:
事实证明,我可以使用 scala-guice 中的 typeLiteral 和 KeyExtensions 来解决我的问题。谢谢塔维安!
由于类型擦除,在 getInstance(classOf[InputService[String]])
调用中,您只是传递了 InputService.class
。您需要传递 TypeLiteral
而不是对通用类型信息进行编码。快速 Google 看起来像
import net.codingwell.scalaguice._
import net.codingwell.scalaguice.InjectorExtensions._
Guice.createInjector(new MockWatcherModule).instance[InputService[String]]
会起作用。
我是 Scala 的新手,当我尝试对我的一些接口进行单元测试时,我 运行 遇到了这个问题。
我有一个带方法的 InputService 特性
def poll(parameters: HashMap[String, String]): Option[T]
其中 T 是通用的,因此 InputService 有一个类型参数 [T]。
在我的模块中,我有
val inputService: InputService[String] = mock(classOf[InputService[String]])
bind[InputService[String]].toInstance(inputService)
在我的 InputServiceTest 中,我有
var inputService: InputService[String] = _
before {
inputService = Guice.createInjector(new MockWatcherModule).getInstance(classOf[InputService[String]])
}
但问题是当我 运行 它时,它给我这个错误
Exception encountered when invoking run on a nested suite - Guice configuration errors:
1) No implementation for services.InputService was bound.
while locating services.InputService
我认为是因为它正在寻找services.InputService来绑定,但它只有services.InputService[String]。但是,当我只使用 InputService 而不是 InputService[String] 时,我收到错误 Trait missing Type Parameter
.
有什么建议吗?
编辑: 事实证明,我可以使用 scala-guice 中的 typeLiteral 和 KeyExtensions 来解决我的问题。谢谢塔维安!
由于类型擦除,在 getInstance(classOf[InputService[String]])
调用中,您只是传递了 InputService.class
。您需要传递 TypeLiteral
而不是对通用类型信息进行编码。快速 Google 看起来像
import net.codingwell.scalaguice._
import net.codingwell.scalaguice.InjectorExtensions._
Guice.createInjector(new MockWatcherModule).instance[InputService[String]]
会起作用。