以下是代码的外观:
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调用。为什么它不按指定返回"东西"?
你需要A
做一个模拟。现在,您正在通过new A
创建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())
但是,模拟类的一个方法以便您可以测试另一个方法通常是一个坏主意™。首先,您需要记住指定doOtherStuff
使用的每种A
方法的行为(可能对所有方法都使用thenCallRealMethod
(。只喜欢嘲笑课堂外的东西。为此,您可以模拟doStuff
所依赖的内容,也可以doStuff
移动到另一个类。