【问题标题】:ScalaMock mocking a trait gives "MockFunction1 cannot be cast to StubFunction1"ScalaMock 模拟特征给出“MockFunction1 不能转换为 StubFunction1”
【发布时间】:2014-11-16 22:57:40
【问题描述】:

以下代码:

import org.scalamock.scalatest.MockFactory
import org.scalatest.FlatSpec

trait SomeTrait {
  def getLongByInt(int: Int): Long
}

class TestScalaMock extends FlatSpec with MockFactory {
  "Scala Mock" should "mock my trait" in {
    val someTrait = mock[SomeTrait]
    (someTrait.getLongByInt _) when (1) returns 2L
    assert(2L == someTrait.getLongByInt(1))
  }
}

给我一​​个运行时错误org.scalamock.MockFunction1 cannot be cast to org.scalamock.StubFunction1。我的项目依赖项是:

scalaVersion := "2.11.0"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.3.7",
  "com.typesafe.akka" %% "akka-testkit" % "2.3.7",
  "org.scalatest" % "scalatest_2.11" % "2.2.1" % "test",
  "org.scalamock" %% "scalamock-scalatest-support" % "3.2" % "test"
  )

有什么想法吗?谢谢!

【问题讨论】:

    标签: scala scalamock


    【解决方案1】:

    ScalaMock 支持两种不同的风格——期望优先和记录后验证(Mockito 风格)。

    对于期望优先,使用mock 创建假对象并使用expects 设置期望。

    对于先记录后验证,使用stub 创建假对象,使用when 设置返回值,使用verify 验证调用。

    在您的代码中,您使用mock(期望优先)和when(记录然后验证)。改用expects,应该没问题。

    (注意,您可以在单个测试中混合不同的样式,但不能用于单个假对象)。

    【讨论】:

    • 似乎很奇怪,它有两个不同的对象而不是一个;乍一看,mock 似乎是只写的。我错过了什么,为什么会这样?
    • 抱歉,我不确定我理解您所说的“只写”是什么意思?如果有办法让单一类型的假对象支持两种模拟样式,我很想听听,但我现在还不清楚如何实现。
    • 如果有某种方法可以在编译时而不是在运行时捕获此类问题,那就太好了。但是mock[SomeTrait]stub[SomeTrait] 表达式的编译时类型必须是SomeTrait。如果不是这样,ScalaMock 就不会做模拟框架应该做的事情。但是,我想知道 ScalaMock 框架是否有可能在运行时识别程序员何时犯了这个错误并在异常消息中提出有用的建议?
    猜你喜欢
    • 2016-07-20
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多