Как вызвать реальный метод на заглушке - PullRequest
1 голос
/ 07 февраля 2020

Есть ли способ вызвать реальный метод для объекта-заглушки с помощью 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 ]

1 голос
/ 07 февраля 2020

Шаблон, который я мог бы порекомендовать, состоит в том, чтобы сделать функцию, которую вы не хотите имитировать, финальной, как вы и предлагали. Но вместо того, чтобы делать это в реальном коде, вы используете подкласс, который используется только для целей тестирования, например, так:

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
  }
}
1 голос
/ 07 февраля 2020

К сожалению, шпионаж недоступен: https://github.com/paulbutcher/ScalaMock/issues/249

0 голосов
/ 07 февраля 2020

К сожалению, 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}"
...