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

问题描述

在此Scala类中

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

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

解决方法

嘲笑会覆盖 all 方法(通常使用 return null,除非明确声明会返回其他内容),而在这里您只想覆盖 one 方法。由于您的课程不是final,所以做类似的事情会更容易

val tested: A = new A {
  override def b = ...
}

比模拟它(实际上,final类的模拟如果没有PowerMock之类也是不可能的)

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

因为mock还将覆盖a,从而使测试无用。您可以通过嘲笑a使其具有与原始版本相同的实现方式来“修复”它,但是由于许多原因,这是荒谬的。

因此可以使用带有模拟框架的经过测试的类来模拟方法,但是这种方法妨碍了人们的工作,而不是提供帮助。