Scala模拟不嘲笑扩展类函数?

时间:2018-05-21 01:38:20

标签: scala mockito

以下是代码的外观:

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调用。为什么不按规定返回“东西”?

1 个答案:

答案 0 :(得分:2)

你需要让A成为模拟者。现在,您正在通过A创建new A的真实实例。相反,请使用mock(classOf[A])(或使用ScalaTest的MockitoSugarmock[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移动到另一个类。