Как макетировать объектный файл, содержащий служебные функции в Scala - PullRequest
0 голосов
/ 26 апреля 2018

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

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

object utility{
    def abc(a: String, b: Int ): String={}
    def bcd(): Int = {}
}

Я использую flatspec и MockFactory

scala 2.11 и sbt со следующими зависимостями

libraryDependencies += "org.scalamock" %% "scalamock" % "4.1.0" % "test",
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.4" % "test"

Ваша помощь будет оценена Спасибо

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Альтернативой предложению Rincewind является использование Mockito:

"org.mockito" % "mockito-core" % "2.9.0" % "test"

trait Utility {
  def abc(a: String, b: Int ): String={}
  def bcd(): Int = {}
}

object RealUtil extends Utility {
  def abc(a: String, b: Int ): String= ??? //real implementation
  def bcd(): Int = ???
}

class UsesUtil(util: Utility) {
   // do sth with util
}

class HereAreTests extends MockitoSugar {
  // use in tests
  val mockedUtility = mock[Utility]
  "this" should "do something" in {
    when(mockedUtility.abc(
      ArgumentMatchers.eq("some input string"),
      ArgumentMatchers.anyInt()
    )).thenReturn("my string")
  // tests which call the `abc` function with input of "some input string" and any number
  }
}

Я считаю, что это гораздо полезнее, когда я хочу быть более конкретным со своими данными. Это означает, что вы можете смоделировать конкретные ожидаемые входы и выходы и избавить вас от необходимости повторно объявлять val каждый раз, когда вы хотите протестировать что-то другое.

Хотя это просто личное предпочтение, я думаю:)

0 голосов
/ 26 апреля 2018

Ну, обычно вы бы сделали что-нибудь. как это:

trait Utility {
  def abc(a: String, b: Int ): String
  def bcd(): Int
}

object RealUtil extends Utility {
  def abc(a: String, b: Int ): String= ??? //real implementation
  def bcd(): Int = ???
}

class UsesUtil(util: Utility) {
   def doSth(): Int = util.bcd()
}

// allows prod usage like this UsesUtil().doSth
object UsesUtil {
  def apply(util: Utility = RealUtil): UsesUtil = new UsesUtil(util)
}

class HereAreTests {
  // use in tests
  val mockedUtility = new Utility {
    def abc(a: String, b: Int ): String= "mock"
    def bcd(): Int = 42
  }

  // test here
  val useUtilClass = new UsesUtil(mockedUtility)
  val resultFromMock = useUtilClass.doSth()
  assert(resultFromMock == 42)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...