`
chxiaowu
  • 浏览: 235120 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

新人解惑之—JUnit and SpringTest

阅读更多

前几天看 UIC-TEST 代码时,顺便也研究了下 SpringTest, 遇到了不少问题,在这里贴出来,以供后人查看,提高他们的学习效率

SpringTest 并不是一个完整的测试框架,它只是为测试提供一些必要的服务,其基石还是 JUnit! 那么它提供的是什么服务呢 ? 下面我们先来研究一下这个问题

众所周知,我们的开发人员使用 spring 的依赖注入解决软件构件之间的耦合问题,那我们的测试代码是否也会存在耦合问题呢?我们是针对接口进行测试,但是在执行一个测试类的测试方法之前,我们需要为这个测试方法准备测试场景,不可避免的是要生成一个待测接口的实现类的实例 , 如下图 :

1

 

这样做的不好之处在于,如果开发人员更换了接口的实现类,那么我们的测试代码也要做相应的修改以适应新的实现类。如何在不修改代码的情况下就能使我们的测试代码快速切入到新的实现类呢 ?spring-test 凭借 spring 的原生特性给我们提供了这种便捷 . 下面我们根据一个简单的例子来展示 spring-test 是如何工作的,最关键的是要理解 spring 在什么时候为我们的测试注入接口的实现类对象 , 这也是本文主要的分享点 ! 请看下面代码 :

4

 

上面那个问题,往往成为菜鸟的一个障碍 , 当时我在研究类似代码的时候也感到很迷茫 , 因为不明白 spring 会在何时将实现类的对象注入到你的属性中,对本例来说, spring 会在何时调用 setCal 方法!这个问题的答案可以在 spring-test 的源代码中找到,下面让我们进入 spring-test 的源代码之旅吧 ….:)

首先我们看看 spring-test 包的继承体系 :

5

 

1.        org.springframework.test.ConditionalTestCase.java : 该类继承了 junit TestCase, 此类有一个有用的方法 isDisabledInThisEnvironment ,在你的测试类中可以覆盖它,如果你不想执行某个测试方法,就返回 true, 在一个测试方法运行前,该方法会被自动调用,以决定当前测试方法是否要执行,这样你就可以只关注你想关注的方法 :

6

2.         org.springframework.test.AbstractSpringContextTests.java: 该类最重要的一点在于它包含有一个静态属性 :

7

 

此属性保存了 spring   applicationContext 实例,意味着不同的测试类可以共享一个 applicationContext, 而不必在每个测试类执行时都去重新实例化 spring 容器

3.         org.springframework.test.AbstractSingleSpringContextTests.java: 该类覆盖了 TestCase 类的 setUp 方法 , 并且不允许测试类再覆盖,因为该方法包含重要操作 —- 初始化 spring 容器 , 并且为 spring 的自动注入留下了伏笔 —prepareTestInstance 方法 ! 作为替代 ,spring 为测试类留了一个初始化入口 —onSetUp 方法,测试类可以覆盖该方法,为每个测试方法执行自定义初始化操作 :

8

 

对于 tearDown 方法,也是一样的,不允许测试类再覆盖 , 但可以覆盖 onTearDown 方法,可以执行自定义的销毁操作

9

 

同时,此类承担了初始化 spring 容器的重要任务,测试类可以覆盖 getConfigLocations 方法为容器的初始化提供配置文件,如:

10

 

4.   org.springframework.test.AbstractDependencyInjectionSpringContextTests.java: 该类覆盖了AbstractSingleSpringContextTests 类中的prepareTestInstance 方法, 该方法在setUp 方法中被调用, 从而实现了自动注入操作, 使得测试类中的属性能够被自动注入,而无需调用getBean 方法手动装配. 该方法首先判断容器是否初始化, 如果已经初始化, 就进入注入操作:
11
更详细的注入操作, 大家可以跟进injectDependencies() 方法, 里面有详细操作流程. 至此我们知道了spring 是如何为测试类注入实现类对象的,本文只是想为初学者作一点提示,扫清他们的学习障碍. 不当之处还请兄弟姐妹们赐教!:)
VN:F [1.9.6_1107]

转载务必注明出处Taobao QA Team

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics