【问题标题】:Mocking configuration objects with MockFactory使用 MockFactory 模拟配置对象
【发布时间】:2018-10-27 22:12:17
【问题描述】:

我正在做一些测试,在很多情况下我都有一个 FTP/HTTP 的配置。

我正在使用 Scala 和我的 sbt 中的以下库:

"org.scalatest" %% "scalatest" % "3.0.1" % Test,
"org.scalamock" %% "scalamock" % "4.1.0" % Test,

我正在为以下代码做一个模拟配置的示例,在我的测试中:

val someConfig = SomeConfig(
  endpoint = "", 
  user = "", 
  password = "", 
  companyName="", 
  proxy = ProxyConfig("", 2323)
)

但我觉得对我将要处理的每个配置都这样做并不好......

我想创建以下内容:

val someConfig = mock[SomeConfig]

但是当我的代码尝试访问代理属性时,它是一个案例类,它失败并出现空指针异常。

我想知道如何模拟包含其他案例类的案例类并使我的代码更清晰,有没有办法用 MockFactory 做到这一点?

【问题讨论】:

    标签: scala scalatest scalamock


    【解决方案1】:

    你可以尝试像这样模拟它:

    val someConfig = mock[SomeConfig]
    when(someConfig.proxy).thenReturn(ProxyConfig("", 2323))
    

    因此,当您尝试获取 someConfig.proxy 时,它将返回 ProxyConfig("", 2323)

    由于known limitation of ScalaMock,上面的代码使用了Mockito

    【讨论】:

    • 您能否提供您的 sbt / 配置或任何其他配置以了解我应该为该语法提供哪些包?以及您在特定测试用例中使用的哪些扩展会很棒。我只看到这适用于某个私有财产的吸气剂,但不适用于与另一个案例类嵌套的案例类的公共属性......可能类似于 scala faker 可能是一个解决方案,但我希望这可以通过模拟来解决工厂....
    • 以上语法来自Mockito。
    【解决方案2】:

    case 类的参数被翻译成val 字段,ScalaMock 有一个known limitation 不能模拟val,所以我认为直接用ScalaMock 做这个是不可能的。

    Mockito 确实有这个能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2020-01-28
      相关资源
      最近更新 更多