`
chxiaowu
  • 浏览: 240146 次
  • 性别: 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

分享到:
评论

相关推荐

    利用JUnit和Spring-test对SpringJDBC组件DAO层测试

    本话题将深入讲解如何利用JUnit和Spring-test这两个工具对SpringJDBC组件的DAO层进行有效测试。 首先,JUnit是一个流行的Java单元测试框架,它允许开发者编写可重复运行的测试用例,以验证代码的正确性。在针对...

    SpringTest_springtest_spring_java_Framework_

    "SpringTest_springtest_spring_java_Framework_"这个标题暗示了我们讨论的是关于Spring框架的测试方面,可能是使用Spring进行单元测试或集成测试的一些实践。 描述中的“简单小应用,实现了一些基本的功能”可能是...

    spring-Test,Junit4 jar,和测试代码

    接下来,我们将深入探讨Spring Test与JUnit4的结合使用以及如何通过它们进行测试代码的编写。 首先,Spring Test模块提供了一组测试注解,如`@ContextConfiguration`、`@RunWith(SpringRunner.class)`等,这些注解...

    SSM中进行单元测试Junit4+spring-test所需jar包

    在SSM环境中,使用Junit4和spring-test库进行单元测试是标准做法。下面将详细解释如何使用这两个库以及所需的jar包。 Junit4是Java领域广泛使用的单元测试框架,它提供了一套丰富的注解,使得编写测试用例变得更加...

    spring-test and junit 的合集

    分别是两个版本的, 因为spring做单元测试的时候, 是很容易出现版本不兼容的情况, 所以我将我用到的jar包分享出来,zip包中内容:hamcrest-core-1.3、junit4.4、junit-4.12、spring_test2.5.5、spring-test-3.2.0....

    junit针对spring mvc三层测试

    本测试着重关注Spring MVC架构中的三层:表现层(Presentation Layer)、业务层(Business Logic Layer)和服务数据访问层(Service and Data Access Layer)。下面我们将详细探讨如何使用JUnit进行针对这三层的测试...

    spring-test and junit

    分别是两个版本的, 因为spring做单元测试的时候, 是很容易出现版本不兼容的情况, 所以我将我用到的jar包分享出来,zip包中内容:spring_test2.5.5、spring-test-3.2.0.RELEASE 这个我忘了上传有关于junit的jar ,...

    struts-junit spring-mock spring-test junit的javadoc.jar文档

    struts-junit spring-mock spring-test junit等的javadoc.jar格式的API文档,直接导入Eclipse/MyEclipse/Netbeans等IDE即可实现快速API查询。 包含以下文件: File name -------------------------------------- ...

    Spring test

    Spring Test旨在简化应用程序的测试工作,通过与JUnit和其他测试框架结合,使得测试变得更加方便和高效。 在Spring Test中,我们可以使用`@RunWith(SpringRunner.class)`注解来启动Spring的测试环境,它会自动配置...

    详解Junit 测试之 Spring Test

    "详解Junit 测试之 Spring Test" Spring Test 是一种基于 JUnit 的测试框架,用于测试 Spring 应用程序。它提供了一种简洁的方式来测试 Spring 应用程序,解决了传统 JUnit 测试中的一些问题。 一、Spring Test ...

    Springtest

    本教程将基于"Springtest"这个项目,深入浅出地探讨Spring框架的基础知识和应用。 一、Spring概述 Spring是一个开源的Java企业级应用程序框架,由Rod Johnson创建,主要目标是简化Java EE开发。它提供了全面的编程...

    spring test学习2

    通过集成JUnit或其他测试框架,Spring Test使得测试Spring Bean的配置、依赖注入以及AOP(面向切面编程)等特性变得简单易行。 二、核心组件 1. `@ContextConfiguration`:此注解用于定义测试上下文的配置文件路径...

    Spring Test 整合 JUnit 4 使用总结.rar

    Spring Test 整合 JUnit 4 使用总结.rar

    spring-text-3.2.8和junit4.10

    Spring Test与JUnit的结合,为Spring应用的测试提供了强大的组合。通过使用`@RunWith(SpringJUnit4ClassRunner.class)`,我们可以将Spring的IoC容器引入到JUnit测试中,使得Spring的组件可以直接在测试环境中被管理...

    spring test

    对于单元测试,Spring Test支持`@RunWith(SpringRunner.class)`,这个注解会将测试运行器设置为SpringJUnit4ClassRunner或SpringJUnit5ClassRunner(取决于JUnit版本),确保每个测试方法都能获得一个独立的Spring...

    spring-framework-2.5.6 (含junit-4.4.jar、spring-test.jar)

    《Spring Framework 2.5.6与JUnit 4.4及Spring Test的深度解析》 在软件开发领域,Spring Framework以其强大的依赖注入、面向切面编程(AOP)以及全面的事务管理等功能,成为了Java应用开发的重要基石。而这次我们...

    junit eclipse testcast Testsuite

    JUnit,作为Java领域最常用的单元测试框架,是每一个开发者必备的技能之一。Eclipse Testcast Testsuite则是基于JUnit的一种扩展,它提供了更强大的测试管理和执行能力,使得在Eclipse环境中进行测试工作更为便捷...

    junit common test case just for my test

    标题 "junit common test case just for my test" 提示我们这是一组用 JUnit 编写的通用测试用例,专门用于个人测试目的。 JUnit 的核心概念包括测试类、测试方法和断言。测试类通常扩展自 JUnit 的 `TestCase` 类...

    junit扩展JspTest.zip

    JspTest是一个不依赖予容器,对jsp页面进行单元测试的junit扩展。内部它使用Jasper作为jsp编译引擎---tomcat的jsp引擎。对于使用maven作为构建工具的团队或个人,使用非常简单,添加下面的依赖到你的pom文件    ...

    单元测试案例junit +spring mvc +springboot

    JUnit作为Java领域最流行的单元测试框架,与Spring MVC和Spring Boot的集成使得开发者能够更高效地进行测试驱动开发(TDD)或行为驱动开发(BDD)。下面将详细介绍这个主题中的相关知识点。 1. JUnit JUnit是一个...

Global site tag (gtag.js) - Google Analytics