Вставить макет объекта в поле сопутствующего объекта - PullRequest
0 голосов
/ 21 мая 2019

У меня есть класс 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 Ответ

3 голосов
/ 21 мая 2019

Почему бы вам просто не сделать инъекцию зависимостей

Например

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"
...