问题描述
@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 中)。
但即使您决定继续模拟,模拟被测类也会破坏测试的全部目的:被测代码与生产代码没有任何共同之处。
模拟用于模拟被测类的依赖项(例如构造函数参数或方法参数)。