模拟函数在 Scala 中没有 return 值 class 正确
Mocked function doesn't return value class correctly in Scala
我需要将函数从任意类型模拟为另一种类型 value-class。
例如使用以下签名 String => ValueClass
。
我的 value-class 是这样实现的:
final case class ValueClass(value: String) extends AnyVal
我正在使用 mockito-scala to mock and 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")
}
}
}
我想知道,为什么这个测试没有通过并模拟函数 returns 解包值?
"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)
这个问题是因为参数化的 return 类型在运行时没有类型信息,因此值 class 总是被装箱,我为这些场景添加了额外的规定,所以盒装实例 returned.
也就是说,对于函数之类的东西,我认为完全跳过模拟是一个更好的主意,除非函数是不纯的或者您想断言一些非正统的行为。
我需要将函数从任意类型模拟为另一种类型 value-class。
例如使用以下签名 String => ValueClass
。
我的 value-class 是这样实现的:
final case class ValueClass(value: String) extends AnyVal
我正在使用 mockito-scala to mock and 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")
}
}
}
我想知道,为什么这个测试没有通过并模拟函数 returns 解包值?
"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)
这个问题是因为参数化的 return 类型在运行时没有类型信息,因此值 class 总是被装箱,我为这些场景添加了额外的规定,所以盒装实例 returned.
也就是说,对于函数之类的东西,我认为完全跳过模拟是一个更好的主意,除非函数是不纯的或者您想断言一些非正统的行为。