【问题标题】:How to override an implicit conversion in my scala test?如何在我的 scala 测试中覆盖隐式转换?
【发布时间】:2016-06-29 21:36:05
【问题描述】:

我正在做一个 scala 测试来测试使用隐式转换方法的代码。我不想使用那些隐式转换,而是想在测试中模拟/覆盖它们。有可能吗?

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

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

在测试方法 A 时,我想模拟/覆盖“asTypeB”而不是实际调用的方法。

【问题讨论】:

  • 能否请您添加您当前正在做什么以及您想要做什么的代码

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


【解决方案1】:

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

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

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

但是编译方法内部的一个隐式在编译时被解析了。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这不是一个好主意,因为我们正在跳过正在测试的部分代码吗?
    • 我认为问题不是关于编译方法A,而是关于测试它。
    • 要启动隐式阴影,类型不必完全相同,它只必须适用于隐式应用。导入被它们的简称遮蔽,最后导入的获胜。例如。 import A.asTypeB; import B.asTypeB - 第二次导入会影响第一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多