scala - 如何使用ScalaMock模拟按名称调用参数(如getOrElse)?

标签 scala mocking callbyname

我希望能够模拟getOrElse方法的返回值,以便它返回通过ScalaMock作为orElse调用名称参数传递的内容

trait ToBeMocked {
  def getOrElse(arg: Int)(orElse: => String): String
}

由于使用了Curala,因此必须使用ScalaMock。运行此:
class CallByNameMockSpec extends Specification with MockFactory {

  trait ToBeMocked {
    def getOrElse(arg: Int)(orElse: => String): String
  }

  "Mocking functions with call-by-name arguments" should {
    "work" in {
      val m = mock[ToBeMocked]

      (m.getOrElse (_: Int)(_: String)).expects(101, *).onCall((x, y) => y)

      m.getOrElse(101)("result") must beEqualTo("result")
    }
  }

}

引发异常:
[error]     ClassCastException:        
test.service.CallByNameMockSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$3$$anonfun$apply$4 cannot be cast to java.lang.String (CallByNameMockSpec.scala:16)

最佳答案

诀窍是使用Product方法的onCall版本,将第二个参数转换为() => String并调用它:

class CallByNameMockSpec extends Specification with MockFactory {

  trait ToBeMocked {
    def getOrElse(arg: Int)(orElse: => String): String
  }

  "Mocking functions with call-by-name arguments" should {
    "work" in {
      val m = mock[ToBeMocked]

      (m.getOrElse (_: Int)(_: String)).expects(101, *).onCall(_.productElement(1).asInstanceOf[() => String]())

      m.getOrElse(101)("result") must beEqualTo("result")
    }
  }

}

关于scala - 如何使用ScalaMock模拟按名称调用参数(如getOrElse)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294830/

相关文章:

scala - flatMap 应用于 List[Option[T]] 时的行为

Scala Bitset 到BitMask 转换

具有依赖注入(inject)的 PHPUnit,使用 instanceof() 测试模拟对象

unit-testing - 如何对使用springSecurityService的 Controller 进行单元测试?

haskell - lambda 演算的按值调用和按名称调用解释器之间的区别

使用动态范围按名称调用

java - scala 中 REPL 变量的后增量和预增量未按预期工作

node.js - 如何在测试套件中仅模拟一次函数?

c# - C# 是否支持按结果调用?

scala - 如何获取开始日期和结束日期之间的月数