以下是代码的外观:
class B {
doStuff() //some API call
}
class A extends B {
val x = doStuff()
...
}
当我嘲笑如下:
class ASpec {
val a = new A
when(a.doStuff()).thenReturn("stuff") <---this should just return "stuff" on the test
assert(true, a.doOtherStuff())
}
问题是它肯定仍在从doStuff()进行API调用。为什么不按规定返回“东西”?
答案 0 :(得分:2)
你需要让A
成为模拟者。现在,您正在通过A
创建new A
的真实实例。相反,请使用mock(classOf[A])
(或使用ScalaTest的MockitoSugar,mock[A]
):
val a = mock(classOf[A])
when(a.doStuff()).thenReturn("stuff")
when(a.doOtherStuff()).thenCallRealMethod() // Necessary since `A` is a mock
assert(a.doOtherStuff())
然而,模拟一个类的一个方法通常是一个坏主意™,以便您可以测试另一个。首先,您需要记住指定A
使用的doOtherStuff
的每个方法的行为(可能在所有方法上使用thenCallRealMethod
)。不要只嘲笑你班级以外的东西。要完成此操作,您可以模拟doStuff
依赖的内容或将doStuff
移动到另一个类。