我应该使用 Scala Mock 模拟特征还是模拟类

问题描述

假设我有以下内容

@ImplementedBy(classOf[DefaultFoo])
trait Foo {
  def a (s : String) : Int
}

class DefaultFoo @Inject()() extends Foo{

  override def a (s : String) = 1

}

@ImplementedBy(classOf[DefaultBaz])
trait Baz {
  def b (s : String) : Int
}

class DefaultBaz @Inject()(val f :Foo) extends Baz{

  override def a (s : String) = 1

}

如果我想测试,比如说 DefaultBaz,我通常使用 ScalaMock,我会在我的测试规范中模拟如下:

class DefaultBazSpec extends AnyWordSpec with MockFactory{

   val mockFoo = mock[Foo]
val b = new DefaultBaz(mockFoo)

   // write tests
}

但我也可以这样做:

val mockFoo = mock[DefaultFoo]

哪个更好?模拟 trait 或认类实现?

解决方法

最好两者都不使用。通常应该避免模拟(尤其是在 Scala 中)。

但即使您决定继续模拟,模拟被测类也会破坏测试的全部目的:被测代码与生产代码没有任何共同之处。

模拟用于模拟被测类的依赖项(例如构造函数参数或方法参数)。