模拟函数无​​法在Scala中正确返回值类

时间:2019-09-26 23:10:13

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

我需要将函数从任意类型模拟为另一个类型。 例如,带有以下签名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"

1 个答案:

答案 0 :(得分:2)

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

问题来自以下事实:在参数化的返回类型上,运行时没有类型信息,因此值类总是装箱的,我为这些情况添加了额外的准备,以便返回装箱的实例。

也就是说,对于函数之类的东西,我认为完全跳过模拟是一个更好的主意,除非函数不纯正或您要断言某些非正统的行为。