如何在我的scala测试中覆盖隐式转换?

时间:2016-06-29 21:36:05

标签: scala unit-testing mockito implicit-conversion scalatest

我正在进行scala测试,测试使用隐式转换方法的代码。我不想使用这些隐式转换,并希望在测试中模拟/覆盖它们。有可能吗?

implicit class Typeconverter(objA: typeA) {
  def asTypeB = {
    // return a typeB object
  }
}

def methodA(request: typeA) {
  ...............
  request.asTypeB
  ...............
}

在测试方法A时,我想模拟/覆盖" asTypeB"而不是被称为实际的人。

2 个答案:

答案 0 :(得分:2)

与任何其他依赖项一样,您可以通过传递来使m可测试。

def m(request: A)(implicit cv: A => B) = ???

然后,测试可以显式或隐式地提供任意转换。

但编译方法中隐含的内部在编译时已解决。

要提供自定义测试版本,请提供由隐式搜索选择的二进制兼容版本的转换。但这可能很棘手,引用另一个答案,听起来并不是一个好主意。如果隐式包装整齐,那么它可能是可行的。

答案 1 :(得分:1)

这听起来不是一个好主意,但是如果你有一个方法或函数的名称和类型与当前范围中隐含的原始名称和类型相同,它将覆盖前一个。这个技巧用于例如狂喜https://github.com/propensive/rapture/blob/dev/json-argonaut/shared/src/main/scala/rapture/json-argonaut/package.scala#L21 https://github.com/propensive/rapture/blob/dev/json-circe/shared/src/main/scala/rapture/json-circe/package.scala#L21