【问题标题】:How to mock/stub only one field in a case class如何在案例类中仅模拟/存根一个字段
【发布时间】:2020-07-26 09:06:31
【问题描述】:

我看过很多关于在使用scalamock进行测试时如何模拟case类中的方法的文章。

但是,有时我只需要模拟一个字段。例如,当我测试一个非常狭窄的工作流程时。

我以为stub[Type].copy(f = "1") 会起作用,但它只返回null

你也不能像方法一样模拟该字段:

val x = mock[Type]
( x.f _ ).when().then("1")

这也不会编译。

在这种情况下有什么解决方法?在这种情况下,最佳做法是什么?我真的应该定义我不需要测试的整个案例类字段吗?

【问题讨论】:

    标签: scala mocking scalamock


    【解决方案1】:

    ScalaMock 确实 not 似乎提供了对 val 字段的模拟,这就是案例类构造函数参数转换为的内容

    我可以模拟 val/lazy val 吗?

    不,Scala 编译器不允许用 def 覆盖 val,所以 使用 ScalaMock 这是不可能的。

    其他模拟工具可能会提供它,例如,它适用于 mockito-scala

    class MockitoScalaCaseClassSpec extends AnyFlatSpec with Matchers with IdiomaticMockito with ArgumentMatchersSugar {
      "mockito-scala" should "mock case class fields" in {
        case class User(name: String)
        val userMock = mock[User]
        userMock.name returns "mocked!"
        userMock.name should be("mocked!")
      }
    }
    

    经常有人主张不要模拟案例类,而只是创建一个实例。另一方面,如果案例类有大量字段,这可能会变得笨拙:mock case class in scala : Mockito

    【讨论】:

    • 没错。 ScalaMock 基于定义匿名子类型或模拟类型的宏。而且你不能覆盖子类中不可变的东西。我的建议是将其提取到一个特征中(使用函数/定义,然后模拟它)。或者使用使用反射和/或字节码黑客的框架。
    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2021-09-23
    • 2017-03-02
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多