jra*_*ali 8 oop unit-testing mocking
当一个类实现一个接口时,很容易模拟,但是,你必须为它创建一个接口.
您也可以通过子类化和覆盖进行模拟.如果您的基类提供无参数保护的构造函数,那么您的子类mocks不依赖于基类构造函数中的更改.
乍一看,似乎创建模拟的子类化方法比为所有内容创建接口更令人满意,但很明显,这并不是大多数人这样做的方式.
那么,为什么基于接口的模拟被认为比基于子类的模拟更好?
与大多数信念相反,即使您进行测试驱动开发(TDD),您仍应遵循良好的设计实践.诀窍是使API可测试且设计良好.TDD不是一种设计方法,而是一种反馈技术.
因此,它不是接口模拟与子类模拟的问题,而是接口与子类的问题.
这是一个非常古老的讨论,应该在1994年结束; 在设计模式中,我们了解到我们应该支持组合而不是继承.
关于这个主题有一个很长的讨论,但简而言之,在具有单一继承的语言中,基于继承的API设计是为了限制所有未来与其他(但未预见到的)维度的可变性.这种语言的继承过于严格.由于所有主要的面向对象语言(Java,C#,Ruby)都具有单一继承,因此您应该看到大多数面向对象的代码库正确地避免了继承.
当设计基于组合而不是继承时,如果你使用模拟对象,那么你将模拟接口,而不是基类.