在 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]]

会起作用。