scala - фиктивная функция и замена реализации в тестах - PullRequest
1 голос
/ 22 мая 2019

Я использую scalatest, и когда я тестирую свой код, я хочу заменить реализацию функции, чтобы она возвращала что-то еще при выполнении тестов.

В JavaScript это действительно просто, и я подумал, что смогу сделатьто же самое в скале.Итак, я хочу что-то вроде этого:

object Module {
  private def bar(): Int = {
     5
  }

  def foo(): Unit = {
    println(bar())
  }
}

И тест будет примерно таким (не обращайте внимания на синтаксис, вы поняли)

class Test extends FunSpec {
   mock(Module.bar, () => 1)
   describe("Test") {
      it("Test") {
         Module.foo() // will print 1
      }
   }
}

Я искалИнтернет и наткнулся на фиктивные библиотеки scala, но ни одна из них, похоже, не смогла заменить реализацию метода.В каждой библиотеке вы должны определить свой макет в тесте и передать его в код, но я не хочу этого делать.

Есть ли способ достичь этого?

Спасибовы.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Вы не можете издеваться Object в Scala, потому что это как статический класс в Java (который вы не можете издеваться либо). (и вы не можете смоделировать объекты scala не в mockito или scalamock (возможно, в их следующей версии)).

Но, если вы измените object Module на class Module, вы можете легко смоделировать эту функцию (используя mockito):

val mockModule = mock[Module]
when(mockModule.bar()).thenReturn(1)
1 голос
/ 22 мая 2019

Вы можете создать фиктивный класс с этой функцией и указать желаемое значение, если вы не хотите использовать макеты, например:

trait SMT{
 def bar: Int
}

class RealImpl extends SMT{
def bar: Int = 5
}

class FakeImpl extends SMT{
def bar: Int = 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...