Смоделируйте функцию в объекте Scala, используя Mockito - PullRequest
0 голосов
/ 28 января 2019

У меня есть проблема, подобная упомянутой в ссылке: Как смоделировать функцию в объекте Scala с помощью Mockito?

У меня есть объект FooInner с методом stringData, которыйпринимает int и выдает строковый вывод

object FooInner {
  def stringData(data: Int): String = {
    data match {
      case 1 => "one"
      case _ => "else"
    }
  }
}

Другой объект, FooOuter, вызывает FooInner для получения строковых данных и выполнения каких-либо операций с ними.

object FooOuter {
  def dummyCall(data: Int): String = {
    FooInner.stringData(data) + "some operation"
  }
}

Моя цель состоит в том, чтобыметод теста FooOuter.dummyCall для строковых данных, НЕ возвращаемый FooInner.stringData

Для того же, я следовал вышеупомянутому посту и создал черту

trait TFooInner {
  def stringData(data: Int): String
}

Изменил подпись FooInner на

object FooInner extends TFooInner {..}

И создал тестовый класс FooTests

class FooTests extends FlatSpec with Matchers with MockitoSugar{
  "dummyCall" should "mocked data" in {
    val service = mock[TFooInner]
    when(service.stringData(1)).thenReturn("1")    // mocked service data -> 1
    assert(FooOuter.dummyCall(1) === "1-some operation")   // TestFailedException:  "[one]-some operation" did not equal "[1]-some operation"
  }
}

, но я до сих пор не могу получить поддельные служебные данные «1».У меня есть следующие вопросы:

  • Как я могу сделать FooOuter тестируемым с данными, не возвращенными из FooInner
  • Это правильный функциональный стиль для кода в Scala?Я чувствую, что FooOuter теперь тесно связан / зависит от FooInner

Scala: 2.11
Mockito: 1.9.5

1 Ответ

0 голосов
/ 28 января 2019

Вы должны изменить оба объекта Inner и Outer, чтобы сделать их тестируемыми.

В общем, вы никогда не должны вызывать object методы напрямую, если вы можете захотеть заглушить их для тестирования.Такие методы должны быть реализованы и доступны через вызовы экземпляра:

  class FooInner {
     def stringData(data: Int): String = { ... }
  }

  object FooInner extends FooInner

   class FooOuter(inner: FooInner) {
     def dummyCall(data: Int): String = inner.stringData(data) + "bar"
   }

   object FooOuter extends FooOuter(FooInner)

Теперь в вашем тесте вы можете выполнить

   val inner = mock[FooInner]
   val testMe = new FooOuter(inner)
   when(inner.stringData(any)).thenReturn("foo")
   testMe.dummyCall(1) shouldBe "foobar"
   verify(inner).stringData(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...