0

我正在尝试模拟一个接受一些 ctor 参数并在构造函数中做一些工作的类。

除了包装我试图模拟的顽皮类之外,ScalaMock 中是否有任何东西实际上可以避免调用构造函数(因为它当前在构造方法中抛出了 NPE)

4

1 回答 1

0

不,那是不可能的。所有模拟都是要模拟的类型的子类,因此将始终调用构造函数。但是,您可以为构造函数中使用的类型构造模拟并指定具体的子类型。例如

import ConstructorWorkaroundTest.{HardToMock, Something}
import org.scalamock.scalatest.MockFactory
import org.scalatest.FunSuite

class ConstructorWorkaroundTest extends FunSuite with MockFactory {
  test("does not work") {
    val m = mock[HardToMock]
  }

  test("works") {
    val s = stub[Something]
    class BetterToMock extends HardToMock(s)
    val m = mock[BetterToMock]

    m.foo _ expects() returning "hello" once()
    m.foo()
  }
}

object ConstructorWorkaroundTest {
  trait Something { def length: Int }

  class HardToMock(s: Something) {
    val naughty = s.length
    def foo() = "hi"
  }
}
于 2018-12-09T20:15:02.490 回答