【问题标题】:Mocked function doesn't return value class correctly in Scala模拟函数在 Scala 中没有正确返回值类
【发布时间】:2020-01-27 06:20:44
【问题描述】:

我需要将一个函数从任意类型模拟为另一种类型,即。 例如使用以下签名String => ValueClass。 这就是我的 的实现方式:

final case class ValueClass(value: String) extends AnyVal

我使用 模拟和 匹配结果:

import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.{Matchers, WordSpecLike}

class ValueClassMockTest 
   extends WordSpecLike
    with MockitoSugar
    with ArgumentMatchersSugar
    with Matchers {

  "mocked function" should {
    "return the same value class" in {
      val f: String => ValueClass = mock[String => ValueClass]

      when(f(any[String])).thenReturn(ValueClass("str"))

      f("anyStringValue") shouldEqual ValueClass("str")
    }
  }

}

我想知道,为什么这个测试没有通过并且模拟函数返回未包装的值?

"str" did not equal ValueClass(str)
ScalaTestFailureLocation: services.ValueClassMockTest at (ValueClassMockTest.scala:16)
Expected :ValueClass(str)
Actual   :"str"
<Click to see difference>

build.sbt

scalaVersion       = "2.12.10"
scalaTest          = "3.0.8"
mockitoScala       = "1.5.17"

【问题讨论】:

  • 看起来像一个错误,您介意在 GitHub 上提出问题吗?
  • 是的,我正在为此打开一个问题。
  • 这可能很棘手,因为 Scala 试图尽可能多地返回未装箱的值,并且编译时类型的存在使一切变得不同。 ScalaTest 和 Mockito 引入的任何反射都可以解决这个问题。有趣的问题。
  • 已修复! (见下面的答案)

标签: value-class value-class mockito-scala scalatest scala mockito scalatest value-class mockito-scala


【解决方案1】:

在 v1.5.18 中修复 (https://github.com/mockito/mockito-scala/pull/152)

问题在于,在参数化的返回类型上,运行时没有类型信息,因此值类总是被装箱,我为这些场景添加了额外的规定,因此返回了装箱的实例。

也就是说,对于像函数这样的东西,我认为完全跳过模拟是一个更好的主意,除非函数不纯或者你想断言一些非正统的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多