【发布时间】:2020-01-27 06:20:44
【问题描述】:
我需要将一个函数从任意类型模拟为另一种类型,即value-class。
例如使用以下签名String => ValueClass。
这就是我的value-class 的实现方式:
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"
【问题讨论】:
-
看起来像一个错误,您介意在 GitHub 上提出问题吗?
-
是的,我正在为此打开一个问题。
-
这可能很棘手,因为 Scala 试图尽可能多地返回未装箱的值,并且编译时类型的存在使一切变得不同。 ScalaTest 和 Mockito 引入的任何反射都可以解决这个问题。有趣的问题。
-
已修复! (见下面的答案)
标签: value-class value-class mockito-scala scalatest scala mockito scalatest value-class mockito-scala