Как вызвать реальный метод на заглушке
Есть ли способ вызвать настоящий метод на заглушенном объекте с помощью scalamock?
Я бы хотел сделать что-то вроде этого:
class MySpec extends FunSpec with Matchers with MockFactory {
trait MyTrait {
def f1: Int
def f2: Int = f1
}
describe("my feature") {
it("should work") {
val t = stub[MyTrait]
(t.f1 _).when().returns(15)
// I would like to do the following:
// (t.f2 _).when().callRealMethod()
t.f2 should be (15)
}
}
}
Примечание. Мне удалось обойти проблему, сделав f2
final, но я хотел бы знать, есть ли способ сделать это без изменения тестируемого кода.
3 ответа
Шаблон, который я мог бы порекомендовать, - сделать функцию, которую вы не хотите высмеивать, окончательной, как вы предложили. Но вместо того, чтобы делать это в реальном коде, вы используете подкласс, который используется только для целей тестирования, например, вот так:
import org.scalamock.scalatest.MockFactory
import org.scalatest.FunSuite
import PartialMockingTest._
class PartialMockingTest extends FunSuite with MockFactory {
test("test case") {
class PartFinalCls extends Cls {
override final def B(): Int = super.B()
}
val f = stub[PartFinalCls]
f.A _ when 7 returns 5
assert(f.B() == 6)
}
}
object PartialMockingTest {
class Cls {
def A(dummy: Int): Int = 5
def B(): Int = A(7) + 1
}
}
К сожалению, шпионство недоступно:https://github.com/paulbutcher/ScalaMock/issues/249
К сожалению, ScalaMock не поддерживает функцию "callRealMethod".
Если когда-либо возможно изменение структуры тестирования, у вас есть альтернативный способ с mockito-scala и трейтом MockitoSugar, который может предоставить вам то, что вы хотите.
Ваш код будет выглядеть примерно так:
class MySpec extends FunSpec with MockitoSugar with Matchers {
trait MyTrait {
def f1: String = "mock"
def f2: String = "not a mock"
}
describe("my feature") {
it("should work") {
val t = mock[MyTrait]
when(t.f1).thenReturn("mocked")
t.f1 shouldBe "mocked"
when(t.f2) thenCallRealMethod()
t.f2 shouldBe "not a mock"
}
}
Вам нужно добавить mockito scala в качестве зависимости tho. (sbt way)
"org.mockito" %% "mockito-scala" % "${version}",
"org.mockito" %% "mockito-scala-scalatest" % "${version}"