如何模拟在Scala / Specs2中使用Mockito返回AnyVal的函数?

时间:2014-07-14 19:05:50

标签: scala mockito specs2

我想在Scala中使用Mockito(确切地说是Specs2)来存储一个返回AnyVal的函数,但它不能正常工作:

import org.specs2.mutable._
import org.specs2.mock._

case class V(s: String) extends AnyVal

class A {
  def f: V = new V("Hello")
}

class Sample extends Specification with Mockito {
    "Mockito" should {
        "mock A" in {
            val a = mock[A]
            a.f returns new V("hoge")
            a.f match {
                case V("hoge") => success
                case _ => failure
            }
        }
    }
}

这失败了:

V cannot be returned by f()
f() should return String

我使用marker接口/ trait找到了一种解决方法(基于我在上面提供的代码片段): https://gist.github.com/mtgto/9251779

但这不是我的任何解决方案,因此它会更改返回的类型(因为模拟/测试库问题)。

之前有人见过这个并知道如何存根这样的功能吗?

1 个答案:

答案 0 :(得分:6)

我找到了一种简化此功能的方法 - 使用原始的Mockito的doReturn与底层的AnyVal类型(在本例中为String)而不是AnyVal本身,所以:

org.mockito.Mockito.doReturn("hoge").when(a).f

而不是:

a.f returns new V("hoge")