是否可以存根或模拟被测 class 的方法?

Is it possible to stub or mock a method of a class under test?

在此Scalaclass

class A{
def a() = {b();}
def b() = {...}
}

如果我想测试 a(),是否可以模拟或存根 b()

模拟覆盖 所有 方法(通常使用 return null 除非明确声明 return 其他) 而在这里你只想覆盖 one 方法。由于您的 class 不是 final,因此执行类似

的操作会更容易
val tested: A = new A {
  override def b = ...
}

而不是模拟它(如果没有像 PowerMock 这样的东西,实际上模拟 final classes 也是不可能的)

val tested = mock[A]
(tested.b _) returning (...)
// tested.a returns null and ignores b

因为 mock 也会覆盖 a 使您的测试无用。您可以通过模拟 a 使其具有与原始实现相同的实现来“修复”它……但出于多种原因,这是荒谬的。

因此,使用模拟框架模拟经过测试的 class 的方法是可行的,但它只会妨碍而不是提供帮助。