【问题标题】:Mocking a val of a trait with scala-mock用 scala-mock 模拟一个特征的 val
【发布时间】:2014-11-27 10:34:35
【问题描述】:

我想模拟一个特征的 val。例如,在这段代码中,模拟 val baz:

trait Foo {
  def bar(): Int
  val baz: Int
}

val fooMock = mock[Foo]
(fooMock.bar _).expects().returning(5)
(fooMock.baz _).expects().returning(6) //doesn't compile

doSomeThing(fooMock)

为了在我的测试中解决这个问题,我扩展了 Foo,并以下列方式实现了baz:

trait FooTest extends Foo {
  override val baz: Int = 5
}

val fooMock = mock[FooTest]
(fooMock.bar _).expects().returning(6)

doSomeThing(fooMock)

但这很丑陋,我希望有一种更标准的方式来使用 scala mock。

我已经看到了这个question 的答案,但它需要将特征中的val 更改为def,我想保留baz 一个val

【问题讨论】:

    标签: scala unit-testing mocking scalamock


    【解决方案1】:

    目前 ScalaMock 的基于宏的模拟不支持这一点。这是我们希望在scala.meta 可用时解决的问题之一。

    如果你想跟踪这个,你可能想关注:

    https://github.com/paulbutcher/ScalaMock/issues/40

    还有另一个可能感兴趣的选项 - ScalaMocks 的基于代理的模拟确实支持模拟 val。例如,请参阅 ScalaMock 测试套件:

    https://github.com/paulbutcher/ScalaMock/blob/master/core_tests/src/test/scala/com/paulbutcher/test/proxy/ProxyMockTest.scala#L163

    【讨论】:

    • 我不知道代理模拟。测试文件给出了一些很好的例子,但是有没有关于它的文档?
    • 抱歉,但代理模拟的文档(如您所见)非常薄弱。好消息是它们比基于宏的模拟要简单得多,所以测试文件中的示例几乎都是“它”:-)
    • 新版本还不支持吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多