`
龙塘湾
  • 浏览: 135669 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

基于spring框架的junit单元测试

阅读更多
利用spring的mock类进行单元测试:
spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类。尤其是web应用相关的mock类,可以大大提高web组件测试的方便性。

打开spring的下载包的mock文件夹(路径...mock\org\springframework\mock\web),就发觉有如下几个文件:

MockHttpServletRequest:是HttpServletRequest接口的mock实现,用来模拟客户端的HTTP请求,很常用的一个类。

MockHttpServletResponse:是HttpServletResponse接口的mock实现,用于模拟服务器对客户端的响应。

MockHttpSession:是对HttpSession接口的mock实现。

DelegatingServletInputStream:是对ServletInputStream接口的mock实现。

DelegatingServletOutputStream:ServletOutputStream的mock实现。需要拦截和分析服务器的输出的流的内容,可以使用该类。

其他的,例如MockFilterConfig,MockPageContext(可以测试预编译的JSP),MockRequestDispatcher,MockServletConfig看名称就知道大概是mock什么的。
举一个例子:
    MockHttpServletRequest request =  new MockHttpServletRequest("POST","/index.do");  
    request.addParameter("username","name");  
    request.addParameter("password","word"); 

利用spring来进行集成测试:
1、AbstractSpringContextTests类[1],该类全部方法是protected的,通常不使用这个类,而使用它的子类们。

2、AbstractDependencyInjectionSpringContextTests类[2]:继承于类[1]:名字N长的。如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。

3、AbstractTransactionalSpringContextTests类[3]:继承于类[2],继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。你对数据库进行一些操作后,它会自动把数据库回滚,这样就保证了你的测试对于环境没有任何影响

4、AbstractTransactionalDataSourceSpringContextTests:继承于类[3],功能更强大,用于测试持久层组件,看其源代码,有一行"protected JdbcTemplate jdbcTemplate;",提供了一个JdbcTemplate的变量,通过该对象可以直接操作数据库。

http://lighter.iteye.com/blog/41733 还提供了两个用spring来进行集成测试(对数据库操作进行测试),业务测试(对业务层进行测试)的例子供下载。

***如何在你的TestCase Class里取得spring context (注意路径问题)?***

你的TestCase Class必须继承的是上述四个AbstractXXXSpringContextTests中的其中一个,那么就必须实现下面这个方法来取得spring context:

   protected abstract String[] getConfigLocations();

例如:

public String[] getConfigLocations() {
    String[] configLocations = { "applicationContext.xml","hibernate-context.xml" };
    return configLocations;
}


请注意要加载的context xml file的路径问题:上述的代码是基于classpath,因此applicationContext.xml和hibernate-context.xml必须放在classpath里(方法一是把xml files放到WEB-INF/classes目录下,另一种方法就是在project properties里把xml files的路径加到classpath里)

那么如果你一定要把context xml files放到WEB-INF目录下,也是可以的,那么应该基于file(基于file的相对路径是相对于project root folder),代码如下:

public String[] getConfigLocations() {
    String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"};
    return configLocations;
}


AbstractXXXSpringContextTests就会根据根据getConfigLocations方法返回的context xml位置的数组来加载并且对加载的Context提供缓存。这是非常重要的,因为如果你在从事一个大项目时,启动时间可能成为一个问题--这不是Spring自身的开销,而是被Spring容器实例化的对象在实例化自身时所需要的时间。例如,一个包括50-100个Hibernate映射文件的项目可能需要10-20秒的时间来加载上述的映射文件,如果在运行每个测试fixture里的每个测试案例前都有这样的开销,将导致整个测试工作的延时,最终有可能(实际上很可能)降低效率。

在某种极偶然的情况下,某个测试可能“弄脏”了配置场所,并要求重新加载--例如改变一个bean的定义或者一个应用对象的状态--你可以调用 AbstractDependencyInjectionSpringContextTests 上的 setDirty() 方法来重新加载配置并在执行下一个测试案例前重建application context

当类 AbstractDependencyInjectionSpringContextTests(及其子类)装载你的Application Context时,你可以通过Setter方法来注入你想要的来自context的bean,而不需要显式的调用applicationContext.getBean(XXX)。因为AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指定的配置文件中帮你自动注入

下面的例子就是通过setter方法来获得context里的ProductManager bean:

public class MyTest extends AbstractDependencyInjectionSpringContextTests {
    ProductManager productManager;

    public String[] getConfigLocations() {
        String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
        return configLocations;
    }

    public void testGetProduct() {
       assertEquals("tomson",productManager.getProductByName("tomson").getName());
    }
   

    //通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX)
    public void setProductManager(ProductManager productManager) {
       this.productManager = productManager;
    }
}


但是如果context里有多个bean都定义为一个类型(例如有多个bean都是ProductManager class类型的),那么对这些bean就无法通过setter方法来自动依赖注入(因为有多个bean同一个类型,不知要自动注入哪个)。在这种情况下你需要显示的调用applicationContext.getBean(XXX)来注入。如:

public class MyTest extends AbstractDependencyInjectionSpringContextTests {
   ProductManager productManager;

   public String[] getConfigLocations() {
      String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
      return configLocations;
   }

   public void onSetUp() {
       productManager = (ProductManager) applicationContext.getBean("productManager");
   }

   public void testGetProduct() {
       assertEquals("tomson",productManager.getProductByName("tomson").getName());
   }

}


如果你的TestCase不使用依赖注入,只要不定义任何setters方法即可。或者你可以继承 AbstractSpringContextTests --这个 org.springframework.test 包中的根类,而不是继承AbstractDependencyInjectionSpringContextTests(及其子类)。这是因为AbstractSpringContextTests 只包括用来加载Spring Context的便利方法但没有自动依赖注入的功能。

另外还有一篇文章介绍了spring单元测试的策略,见http://blog.csdn.net/wangjian5748/archive/2006/09/09/1199549.aspx



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/totogogo/archive/2007/05/01/1594283.aspx
分享到:
评论

相关推荐

    如何编写干净的单元测试用例

    读者最好对Spring框架及Spring框架提供的单元测试支持有所了解,因为本文案例基于Spring技术编写。但对Spring不了解并不影响本文所讲述的单元测试用例编写及回调模式、模板方法的应用。单元测试是编写高质量代码的...

    使用Spring2.5TestContext测试框架

    概述直接使用JUnit测试Spring程序存在的不足一个需要测试的Spring服务类编写UserService的测试用例准备测试数据并检测运行结果SpringTestContext测试框架体系结构小结参考资料Spring2.5TestContext测试框架用于测试...

    SSM框架教程Spring+SpringMVC+MyBatis全覆盖_Java热门框架视频教程

    8、Spring集成Junit测试 9、Spring集成web环境 10、Spring JDBCTemplate基本使用 11、SpringAOP简介和快速入门 12、Spring XML方式配置AOP 13、Spring注解方式配置AOP 14、Spring编程式事务控制介绍 15、Spring基于...

    基于springboot框架的网上商城系统的设计与实现.zip

    这个系统是基于Spring Boot框架开发的,Spring Boot是一个开源的Java基础框架,它简化了基于Spring的应用程序的开发过程,使得开发者能够快速搭建和部署微服务或Web应用。该资源包中可能包含以下几个主要部分:项目...

    Spring+3.x企业应用开发实战光盘源码(全)

     第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。  第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...

    making-sense-dependency-injection-test-execution-listener:Spring JUnit Spock的测试侦听器,以访问@BeforeClass中的bean

    该侦听器对于Spring / JUnit测试以及基于JUnit的测试框架实现(例如 )最有用。 它将确保在调用@BeforeClass之前预加载Spring ApplicationContext并自动装配所有bean(按类型)。 #为什么我会需要它? 在以下...

    基于框架的Web开发-使用springJDBC入门.doc

    (1) spring框架中(4.3.3):oap、beans、context、core、expression、tx(事务)、test(测试)、jdbc (2) 日志:commens-logging (4) dbcp数据源:commons-dbcp、commons-pool (5) junit: junit、hamcrest (6) ...

    Spring高级之注解驱动开发视频教程

    SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合spring一起测试。 本套课程中,我们将全面剖析Spring和SpringMVC两个部分。从应用场景分析,到基本用法的入门...

    spring4.1核心包

    15. spring-test-4.1.1.RELEASE.jar 支持Spring组建JUnit和TestNG的单元测试和集成测试。 16. spring-tx-4.1.1.RELEASE.jar 17. spring-web-4.1.1.RELEASE.jar 包含Web应用开发时,用到Spring框架时所需的核心类,...

    spring4.3.9相关jar包

    spring-test.jar:对JUNIT等测试框架的简单封装 spring-tx.jar:为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。 spring-webmvc-portlet.jar:Spring MVC的增强 spring-websocket.jar:

    mastering-junit5:使用JUnit 5创建的测试示例的完整集合

    Spring(旨在基于依赖注入创建企业应用程序的Java框架)。 Docker(容器平台技术)。 Selenium(Web应用程序的测试框架)。 Appium(移动设备驱动程序)。 Android(基于Linux的开源移动操作系统)。 REST服务...

    Java测试新技术TestNG和高级概念.part1

    无论您使用TestNG,JUnit或其他测试框架,本书提供的测试设计模式都会告诉您如何改进您的测试,对如何让代码和设计变得更可测试提供具体的建议。 目录: 第1章 起步 1.1 超越JUnit 3 1.2 JUnit 4 1.3 针对可测试性而...

    基于BootStrap和SpringBoot的学生信息管理系统,支持增删改查等基础操作,适合个人web开发学习,毕业设计或课设等

    使用了 Spring - Test 与Junit 编写单元测试代码;使用了 Restful 设计风格,以 AJAX 发送 PUT 与 DELETE 类型请求;采用了双端校验,前端校验 JQuery,后端校验符合 JSR303 规范 基于BootStrap和SpringBoot的学生...

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    最新-客户关系管理系统-(基于SSH框架+Ajax)

    项目技术和环境简介: Struts1.2、Hibernate3、Spring2.5、Ajax、Dwr、Oracle10g/sqlserver、Tomcat6.0、Junit、Log4j全新的客户关系管理系统!从需求分析和ER图形基本设计和入手直到编码和测试结束、包含一系列文档! ...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。  第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...

    spring-framework-2.5.1类包

    从诞生之初,Spring框架就坚守它的宗旨:简化企业级应用开发,同时给复杂问题提供强大的、非侵入性解决方案。一年前发布的Spring2.0就把这些主题推到了一个新的高度。XML Schema的支持和自定义命名空间的使用大大...

    跳板:基于Spring Boot的生产级入门套件

    跳板 基于生产就绪的Maven的Spring Boot入门套件应用程序。 描述 入门套件,用于快速启动基于API的基于Spring的Java服务器的开发。...Junit-单元测试框架 应用结构 |____src | |____main | | |____java

Global site tag (gtag.js) - Google Analytics