软件测试技术之依赖注入和单元测试
从安 2019-06-26 来源 : 阅读 1012 评论 0

摘要:本篇文章主要讲述软件测试技术之依赖注入和单元测试,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章主要讲述软件测试技术之依赖注入和单元测试,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

软件测试技术之依赖注入和单元测试

  近些年来对于依赖注入(Dependency Injection)这个词大家已经应该很熟悉了。我们经常使用它因为这是一个非常好的面向对象概念。你可能也听说过Spring框架(Spring Framework),就是所谓的依赖注入容器,在你的印象里面依赖注入和Spring是等同的。但这个想法是错误的,依赖注入是一个很简单的概念,它可以被应用到任何地方,除了依赖注入容器之外,它同样能够被应用到单元测试中。这篇文章我们讨论一下几点:

  1.什么是依赖注入

  2.如何实现一个友好的依赖注入类

  3.为什么依赖注入可以使单元测试更加简单

  Ladies and gentlemen,开动你的引擎!

  1. 一辆简单的car

   

  首先我们考虑一个简单的例子,这里我们使用engine 类和car 类。为了更加清楚的描述问题,我们将类和接口都置空。每辆car会有一个engine,我们想给car装备上著名的MooseEngine。

  Engine类如下:

  1 public interface Engine {

  2

  3 }

  4

  5 public class SlowEngine implements Engine {

  6

  7 }

  8

  9 public class FastEngine implements Engine {

  10

  11 }

  12

  13 public class MooseEngine implements Engine {

  14

  15 }


  然后我们可以得到一个car类:

  1 public class Car {

  2

  3        private MooseEngine engine;

  4

  5 }


  这是一辆非常棒的汽车,但是即使有其他种类的引擎上市,我们也不能装备这些引擎了。我们说这里的car类和MooseEngine类是紧耦合的(tightly coupled)。虽然MooseEngine很棒,但是如果我们想把它换成别的引擎呢?

  2. 接口编程

  你可能已经注意到了MooseEngine实现了Engine接口。其它引擎也实现了同样的接口。我们可以想一想,当我们设计我们的Car类时,我们想让一辆“car”装备一个“engine”。所以我们重新实现一个Car类,这次我们使用Engine接口:

   

  1 public class Car {

  2

  3         private Engine engine;

  4

  5 }


  接口编程是依赖注入中的一个很重要的概念。我听到了你的尖叫,“等一下,你在这里使用接口,具现类(concrete class)该怎么办?你在哪里设置(set)引擎?我想在我的汽车中装备MooseEngine”。我们可以按下面的方式来设置它:

  1 public class Car {

  2

  3         private Engine engine = new MooseEngine();

  4

  5 }


  但这就是有用的么?它看上去和第一个例子没有多大区别。我们的car仍然同MooseEngine是紧耦合的。那么,我们该如何设置(set或者说注入(inject))我们的汽车引擎呢?

  3. 依赖注入介绍

  就像依赖注入这个名字一样,依赖注入就是注入依赖,或者简单的说,设置不同实例之间的关系。一些人将它同好莱坞的一条规矩关联了起来,“不要给我打掉话,我打给你。”我更喜欢叫它“bugger”法则:“我不关心你是谁,按我说的做。”在我们的第一个例子中,Car依赖的是Engine的具现类MooseEngine。当一个类A依赖于另外一个类B的时候,类B的实现直接在类A中设置,我们说A紧耦合于B。第二个例子中,我们决定使用接口来代替 具现类MooseEngine,这样就使得Car类更加灵活。并且我们决定不去定义engine的具现类实现。换句话说,我们使Car类变为松耦合(loosely coupled)的了。Car不再依赖于任何引擎的具现类了。那么在哪里指定我们需要使用哪个引擎呢?依赖注入该登场了。我们不在Car类中设置具现化的Engine类,而是从外面注入。这又该如何实现呢?

  3.1 使用构造函数来注入依赖

  设置依赖的一种方法是把依赖类的具体实现传递给构造函数。Car类将会变成下面这个样子:

  

  1 public class Car {

  2

  3         private Engine engine;

  4

  5         public Car(Engine engine) {

  6

  7                this.engine = engine;

  8

  9         }

  10

  11 }


  然后我们就可以用任何种类的engine来创建Car了。例如,一个car使用MooseEngine,另外一个使用crappy SlowEngine:

 

  1 public class Test {

  2

  3         public static void main(String[] args) {

  4

  5                Car myGreatCar = new Car(new MooseEngine());

  6

  7                Car hisCrappyCar = new Car(new SlowEngine());

  8

  9         }

  10

  11 }


  3.2 使用setter来注入依赖

  另外一种设置依赖的普通方法就使用setter方法。当需要注入很多依赖的时候,建议使用setter方法而不是构造函数。我们的car类将会被实现成下面的样子:

  

  1 public class Car {

  2

  3         private Engine engine;

  4

  5         public void setEngine(Engine engine) {

  6

  7                this.engine = engine;

  8

  9         }

  10

  11 }


  它和基于构造函数的依赖注入非常类似,于是我们可以用下面的方法来实现上面同样的cars:

  1 public class Test {

  2

  3         public static void main(String[] args) {

  4

  5                Car myGreatCar = new Car();

  6

  7                myGreatCar.setEngine(new MooseEngine());

  8

  9                Car hisCrappyCar = new Car();

  10

  11                hisCrappyCar.setEngine(new SlowEngine());

  12

  13         }

  14

  15 }


 4. 在单元测试中使用依赖注入


本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!


本文由 @从安 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程