在 scala 中模拟生成 java.lang.NoSuchMethodException
Mocking in scala generates a java.lang.NoSuchMethodException
嘿,我正在尝试测试以下 class :
class Foo {
def f: Int = 4 + g
def g: Int = 2
}
我的测试如下:
class FooSpec extends PlaySpec with MockFactory {
val foo = new Foo()
"Foo" must {
"Call function f" in {
(foo.g _)
.expects()
.once()
.returns(5)
foo.f must be (9)
}
}
}
我的测试失败说:
java.lang.NoSuchMethodException: Foo.mock$g[=13=]()
java.lang.Class.getMethod(Unknown Source)
...
我不确定为什么...
我正在使用 scalatest 和 scalamock :
"org.scalatestplus.play" %% "scalatestplus-play" % "1.5.0" % "test"
"org.scalamock" %% "scalamock-scalatest-support" % "3.2.2" % "test"
我在这里看到两个问题:
- 如果不实际模拟对象就无法建立模拟答案:您创建
val foo = new Foo()
,但您必须先 mock
这个 class:val foo = mock[Foo]
- 看起来 ScalaMock 不支持部分存根实例,所以你不能存根方法
g
并期望它在你调用 f
时被调用 - 你将不得不重组你的代码以 Foo.g
从另一个 class 调用的方式 - 也许将其包装在委托中。或者使用 Mockito - 与 ScalaMock 的编译时间相比,它并不那么花哨并且在运行时发挥它的魔力,但它提供了 callRealMethod()
在模拟 class. 上的能力
基本上 ScalaMock 在 mock
或 stub
traits 时效果最好,而不是 classes - 它们的宏不必处理方法的实际实现,没有人会期望他们。
嘿,我正在尝试测试以下 class :
class Foo {
def f: Int = 4 + g
def g: Int = 2
}
我的测试如下:
class FooSpec extends PlaySpec with MockFactory {
val foo = new Foo()
"Foo" must {
"Call function f" in {
(foo.g _)
.expects()
.once()
.returns(5)
foo.f must be (9)
}
}
}
我的测试失败说:
java.lang.NoSuchMethodException: Foo.mock$g[=13=]()
java.lang.Class.getMethod(Unknown Source)
...
我不确定为什么...
我正在使用 scalatest 和 scalamock :
"org.scalatestplus.play" %% "scalatestplus-play" % "1.5.0" % "test"
"org.scalamock" %% "scalamock-scalatest-support" % "3.2.2" % "test"
我在这里看到两个问题:
- 如果不实际模拟对象就无法建立模拟答案:您创建
val foo = new Foo()
,但您必须先mock
这个 class:val foo = mock[Foo]
- 看起来 ScalaMock 不支持部分存根实例,所以你不能存根方法
g
并期望它在你调用f
时被调用 - 你将不得不重组你的代码以Foo.g
从另一个 class 调用的方式 - 也许将其包装在委托中。或者使用 Mockito - 与 ScalaMock 的编译时间相比,它并不那么花哨并且在运行时发挥它的魔力,但它提供了callRealMethod()
在模拟 class. 上的能力
基本上 ScalaMock 在 mock
或 stub
traits 时效果最好,而不是 classes - 它们的宏不必处理方法的实际实现,没有人会期望他们。