【问题标题】:Inject mock object to companion object field将模拟对象注入伴随对象字段
【发布时间】:2019-10-08 03:38:21
【问题描述】:

我有一个这样的 Scala 类:

object MyClient {
  private lazy val theClient: TheClient = new TheClient()
}

class MyClient {
  import MyClient._

  var client = null // this is only for unittest

  def getSomethingFromTheClient() = {
    if (client == null) client = theClient 
    client.getSomething() + " from MyClient" 
  }
}

其中一些代码只是为了方便单元测试,我可以在其中模拟 TheClient 并将其注入 MyClient,如下所示(我正在使用 Mockito):

val mockTheClient = mock[TheClient]
val testMyClient = new MyClient()
testMyClient.client = mockTheClient
testMyClient.getSomethingFromTheClient() shouldBe "blabla"

这可行,但看起来很难看。理想情况下,如果我可以将 mockTheClient 注入到伴随对象字段中,那就太好了。还是我错过了其他东西?

【问题讨论】:

  • 所以我在这个问题上有四个-1。 (公平地说,还有两个 +1。)但没有一个 -1 人留下任何评论。如果您认为这个问题真的很糟糕并且应该被-1ed,我真的很感激为什么会这样。谢谢!

标签: scala mockito scalatest companion-object


【解决方案1】:

为什么不直接做依赖注入

例如

lazy val client: TheClient = new TheClient()

class MyClient(client: => TheClient) {
  def getSomethingFromTheClient() = {
    client.getSomething() + " from MyClient" 
  }
}

然后在中测试

val mockTheClient = mock[TheClient]
val testMyClient = new MyClient(mockTheClient)
testMyClient.getSomethingFromTheClient() shouldBe "blabla"

【讨论】:

  • 感谢@Bruno! 1)我想让 TheClient() 保持懒惰。即在应用程序启动时创建 MyClient,但仅在实际使用时创建 TheClient。对于 2)我的代码是 setter 依赖注入,我看不出与你代码中的构造函数依赖注入有多大区别?
  • 1) 我已经修改了答案,所以客户端是懒惰地创建的。 2) setter 注入需要可变状态,这是您希望尽可能避免的事情(即使在 Java 构造函数中注入 final 字段也被认为比 setter 注入更好)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多