【问题标题】:How to mock function returning AnyVal with Mockito in Scala / Specs2?如何在 Scala / Specs2 中使用 Mockito 模拟返回 AnyVal 的函数?
【发布时间】:2014-07-14 19:05:50
【问题描述】:

我想在 Scala 中使用 Mockito 存根返回 AnyVal 的函数(准确地说是 Specs2),但它无法正常工作:

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

我找到了一种使用标记接口/特征的解决方法(基于我在 sn-p 上面提供的): https://gist.github.com/mtgto/9251779

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

任何人以前见过这个并且知道如何存根这样的函数?

【问题讨论】:

    标签: scala mockito specs2


    【解决方案1】:

    我找到了一种存根此函数的方法 - 使用原始 Mockito 的 doReturn 和底层 AnyVal 的类型(在本例中为字符串)而不是 AnyVal 本身,所以:

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

    代替:

    a.f returns new V("hoge")
    

    【讨论】:

    • 我已经尝试了一些方法,但我认为没有比您正在做的更好的方法了。 doReturn 没有经过类型检查,而 returns 是这样,这就是它起作用的原因。 Scala/Java 互操作中的另一个问题。我猜是问题书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2017-10-17
    相关资源
    最近更新 更多