前段时间,我在找不到的Stack Overflow答案上读了一句话,该句子解释您应该测试公共API,而作者说您应该测试接口。作者还解释说,如果更改了方法实现,则无需修改测试用例,因为这样做会破坏确保被测系统正常工作的契约。换句话说,如果方法不起作用,则测试应该失败,但这不是因为实现发生了变化。
当我们谈论嘲笑时,这引起了我的注意。由于模拟在很大程度上依赖于被测系统依赖项的期望调用,因此模拟与实现紧密相关,而不是与接口紧密相关。
在研究模拟与存根时,有几篇文章认为应该使用存根而不是模拟,因为它们不依赖于依赖项的期望,这意味着测试不需要了解测试实施中的基础系统。
我的问题是:
- 模拟是否违反开放/封闭原则?
- 在上一段中支持存根的论点中是否缺少某些内容,使存根与模拟不那么好?
- 如果是这样,什么时候可以模拟一个好用例,什么时候可以使用存根?
Since mocking relays heavily on expectation calls from system under test's dependencies...
我认为这是您要去的地方。模拟是外部系统的一些人为表示。 它不以任何方式表示外部系统,除非它以某种方式模拟外部系统,以便允许针对依赖于该外部系统的代码运行测试。您仍然需要进行集成测试,以证明您的代码可与真实的,未经模拟的系统一起使用。