重构12-Break Dependencies(打破依赖)
2016-08-19 09:31
387 查看
有些单元测试需要恰当的测试“缝隙”(test seam)来模拟/隔离一些不想被测试的部分。如果你正想在代码中引入这种单元测试,那么今天介绍的重构就十分有用。在这个例子中,我们的客户端代码使用一个静态类来实现功能。但当需要单元测试时,问题就来了。我们无法在单元测试中模拟静态类。解决的方法是使用一个接口将静态类包装起来,形成一个缝隙来切断与静态类之间的依赖。
重构时我们所要做的就是引入一个接口和简单调用上面那个静态类的类。因此行为还是一样的,只是调用的方式产生了变化。这是一个不错的重构起始点,也是向代码添加单元测试的简单方式。
现在,我们可以在单元测试中将模拟的IFeederService传入AnimalFeedingService构造函数。测试成功后,我们可以将静态方法中的代码移植到FeederService类中,并删除静态类
来自为知笔记(Wiz)
public class AnimalFeedingService { private Boolean FoodBowlEmpty; public void Feed() { if (FoodBowlEmpty) Feeder.ReplenishFood(); // more code to feed the animal } } public static class Feeder { public static void ReplenishFood() { // fill up bowl } }
重构时我们所要做的就是引入一个接口和简单调用上面那个静态类的类。因此行为还是一样的,只是调用的方式产生了变化。这是一个不错的重构起始点,也是向代码添加单元测试的简单方式。
public class AnimalFeedingService{ public IFeederService FeederService; public AnimalFeedingService(IFeederService feederService){ FeederService = feederService; } private Boolean FoodBowlEmpty; public void Feed(){ if (FoodBowlEmpty) FeederService.ReplenishFood(); // more code to feed the animal } } public interface IFeederService{ void ReplenishFood(); } public class FeederService extends IFeederService{ public void ReplenishFood(){ Feeder.ReplenishFood(); } } public static class Feeder{ public static void ReplenishFood(){ // fill up bowl } }
现在,我们可以在单元测试中将模拟的IFeederService传入AnimalFeedingService构造函数。测试成功后,我们可以将静态方法中的代码移植到FeederService类中,并删除静态类
来自为知笔记(Wiz)
相关文章推荐
- JSPatch实现原理
- 《Motion Design for iOS》(四十六(最终章))
- XML 读取
- 重构11-Switch to Strategy(Switch到策略模式)
- 重构10-Extract Method(提取方法)
- Android与单片机通信常用数据转换方法(汇总)
- 关于Drawable转Bitmap的错误,为0的处理办法
- JS获取当前页面名称的简单实例
- Java:将字符串中的数字转换成整型
- 注释掉打开热点的提示框
- 【笔试】下厨房
- 网络访问框架源码分析--待完善
- mysql性能优化
- Java:将字符串中的数字转换成整型
- Java:将字符串中的数字转换成整型
- NetSnmp配置
- 重构9-Extract Interface(提取接口)
- 如何查看谷歌卫星地图每级分辨率的两种方法
- kaggle之旧金山犯罪
- 用角度计算出向量坐标