模拟函数在 Scala 中未正确返回值类



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

final case class ValueClass(value: String) extends AnyVal

我正在使用 mockito-scala 来模拟和 scalatest 以匹配结果:

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"

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

问题来自这样一个事实,即在参数化的返回类型上,运行时中没有类型信息,因此值类始终是装箱的,我为这些场景添加了额外的规定,以便返回装箱实例。

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

最新更新