问题

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

 final case class ValueClass(value: String) extends AnyVal
 

我正在使用来模拟和到matche结果:

 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 )

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

尽管如此,对于像函数这样的东西,我认为是一个更好的想法,可以完全跳过嘲笑,除非函数不真实或者你想要断言一些非正统的行为.

  相同标签的其他问题

value-classmockito-scalascalatestscalamockito