ScalaMock, имитирующий трейт, дает MockFunction1, который нельзя преобразовать в StubFunction1.

Следующий код:

import org.scalamock.scalatest.MockFactory
import org.scalatest.FlatSpec

trait SomeTrait {
  def getLongByInt(int: Int): Long
}

class TestScalaMock extends FlatSpec with MockFactory {
  "Scala Mock" should "mock my trait" in {
    val someTrait = mock[SomeTrait]
    (someTrait.getLongByInt _) when (1) returns 2L
    assert(2L == someTrait.getLongByInt(1))
  }
}

Выдает ошибку времени выполнения org.scalamock.MockFunction1 cannot be cast to org.scalamock.StubFunction1. Мои зависимости проекта:

scalaVersion := "2.11.0"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.3.7",
  "com.typesafe.akka" %% "akka-testkit" % "2.3.7",
  "org.scalatest" % "scalatest_2.11" % "2.2.1" % "test",
  "org.scalamock" %% "scalamock-scalatest-support" % "3.2" % "test"
  )

Любые идеи? Спасибо!


person simbo1905    schedule 14.11.2014    source источник


Ответы (1)


ScalaMock поддерживает два разных стиля: сначала ожидание и запись, затем проверка (стиль Mockito).

Для ожидания сначала используйте mock для создания поддельного объекта и expects для установки ожиданий.

Для записи и проверки используйте stub для создания поддельного объекта, when для настройки возвращаемых значений и verify для проверки вызовов.

В своем коде вы используете mock (сначала ожидания) вместе с when (запись-затем-проверка). Вместо этого используйте expects, и все будет в порядке.

(обратите внимание, вы можете смешивать разные стили в рамках одного теста, но не для одного поддельного объекта).

person Paul Butcher    schedule 15.11.2014
comment
кажется странным, что у него два разных объекта, а не один; на первый взгляд кажется, что mock только для записи. я что-то упустил, почему это так? - person simbo1905; 15.11.2014
comment
Извините, я не уверен, что понимаю, что вы имеете в виду под "только для записи"? Если есть способ, чтобы один тип фальшивого объекта поддерживал оба стиля насмешек, я бы хотел это услышать, но мне не ясно, как этого можно добиться прямо сейчас. - person Paul Butcher; 15.11.2014
comment
Было бы здорово, если бы был какой-то способ для обнаружения проблем такого типа во время компиляции, а не во время выполнения. Но тип времени компиляции выражений mock[SomeTrait] и stub[SomeTrait] должен быть SomeTrait. Если бы это было не так, ScalaMock не делал бы того, что должен делать фиктивный фреймворк. Однако мне интересно, может ли среда ScalaMock определить во время выполнения, когда программист допустил эту ошибку, и поместить полезное предложение в сообщение об исключении? - person Daryl Odnert; 24.01.2015