第7章:模拟对象
1. TDD中可遇不可求,编写测试时竭力追求的是:目标专一的测试(理想情况下每个测试只有一个断言);彼此独立的测试(每个测试都存在预设环境的建立和清除,以便测试可以以任何顺序运行);运行速度快的测试(能频繁地运行测试)。
2. 专一、独立和执行速度快有一定矛盾的地方,因为必须做到合理处理好资源,模拟对象(mock object)提供了一种得到证明的成功解决方案。在很难或者不可能为某种难以处理的资源创建需要的状态或存取资源受到限制时使用。
3. 模拟对象背后的思想就是创建轻量级,可控制的对象来代替为了编写测试而需要使用对象。模拟对象还能够让你指定和测试你的代码与模拟对象本身之间的交互。
4. 抽取接口是模拟对象常用的方式。5. 模拟对象有助于保持设计的松散耦合(针对接口为中心,消除依赖对象内部实现);检查代码使用另一个对象是否得当(可以在模拟对象中设定期望值(expectation));由内而外利用TDD(通过在模拟对象忠设定返回值,可以为正在开发的代码提供特定的信息);可以让测试进行得更快(避免了真实连接资源的情况);更容易开发与硬件设备远程系统等难处理的资源进行交互的代码(可以开发出代理层(proxy layer),来隔离实际的资源);推迟必须的类实现(需要花很大精力的类);提倡了基于接口的设计(这样的设计风格值得提倡);鼓励使用组合(composition)而不是继承;改进接口(烤修改接口,早早地有机会思考接口并改进);可以测试非同寻常,不大可能出现的例外情况。
5. 模拟对象有助于保持设计的松散耦合(针对接口为中心,消除依赖对象内部实现);检查代码使用另一个对象是否得当(可以在模拟对象中设定期望值(expectation));由内而外利用TDD(通过在模拟对象忠设定返回值,可以为正在开发的代码提供特定的信息);可以让测试进行得更快(避免了真实连接资源的情况);更容易开发与硬件设备远程系统等难处理的资源进行交互的代码(可以开发出代理层(proxy layer),来隔离实际的资源);推迟必须的类实现(需要花很大精力的类);提倡了基于接口的设计(这样的设计风格值得提倡);鼓励使用组合(composition)而不是继承;改进接口(烤修改接口,早早地有机会思考接口并改进);可以测试非同寻常,不大可能出现的例外情况。