代码之家  ›  专栏  ›  技术社区  ›  Michał Majcherski

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

  •  6
  • Michał Majcherski  · 技术社区  · 10 年前

    我想在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
    

    我发现了一种变通方法(基于我在上面的片段中提供的方法),使用标记接口/特征: https://gist.github.com/mtgto/9251779

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

    任何人都见过这种情况,知道如何存根这样的函数吗?

    1 回复  |  直到 10 年前
        1
  •  7
  •   Michał Majcherski    10 年前

    我找到了一种清除此函数的方法-使用原始Mockito的doReturn和底层AnyVal的类型(在本例中为String),而不是AnyVal本身,因此:

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

    而不是:

    a.f returns new V("hoge")