`

spring 2.5 TestContext 测试框架

 
阅读更多

大多同事都已经养成用junit写单元测试的习惯,但junit在测试spring 时,存在一些不足!

1.   Spring 容器多次初始化问题
根据 JUnit 测试用例的调用流程,每执行一个测试方法都会重新创建一个测试用例实例并调用其 setUp() 方法。由于在一般情况下,我们都在 setUp() 方法中初始化 Spring 容器,这意味着测试用例中有多少个测试方法,Spring 容器就会被重复初始化多少次

2.   用硬编码方式手工获取 Bean

在测试用例中,我们需要通过 ApplicationContext.getBean("bean id") 的方法从 Spirng 容器中获取需要测试的目标 Bean,并且还要进行造型操作。

 

3.  数据库现场容易遭受破坏

测试方法可能会对数据库记录进行更改操作,破坏数据库现场。虽然是针对开发数据库进行测试工作的,但如果数据操作的影响是持久的,将会形成积累效应并影响到测试用例的再次执行。举个例子,假设在某个测试方法中往数据库插入一条 ID 为 1 的 t_user 记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例执行失败。所以测试用例应该既能够完成测试固件业务功能正确性的检查,又能够容易地在测试完成后恢复现场.

 

4. 不容易在同一事务下访问数据库以检验业务操作的正确性

当测试固件操作数据库时,为了检测数据操作的正确性,需要通过一种方便途径在测试方法相同的事务环境下访问数据库,以检查测试固件数据操作的执行效果。如果直接使用 JUnit 进行测试,我们很难完成这项操作。

 

Spring 测试框架是专门为测试基于 Spring 框架应用程序而设计的,它能够让测试用例非常方便地和 Spring 框架结合起来.

 

下面我们看下如何使用:

1.    加jar包:
如果你使用的是spring2.5.6,请把\spring-framework-2.5.6\dist\modules\spring-test.jar   copy到你的web项目的lib下。

把Juint4.4以上的jar包copy进web-info下的lib中。一定要注意是4.4以上的版本才支持。

 

2.    写测试基类,要从AbstractTransactionalJUnit4SpringContextTests继承

package cn.xxt.jsr250.action;

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

@ContextConfiguration(locations={"/applicationContext.xml","/cn/xxt/jsr250/action/beans.xml"})
public class AbstractBaseTransactionalSpringContextTests extends AbstractTransactionalJUnit4SpringContextTests {

}

 

备注:如果要引入多个配置文件,如同代码中所写,如果只有一个

//@ContextConfiguration(locations="/applicationContext.xml")

 

3.  写具体的测试类,继承测试基类

package cn.xxt.jsr250.action;

import javax.annotation.Resource;

import org.junit.Test;

import cn.xxt.jsr250.domain.ExamUser;
import cn.xxt.jsr250.service.ExamUserService;

/**
 * spring 单元测试
 * @author   zhaoguoli
 * @version  1.0  2011-10-9下午07:07:33 create
 */
public class ExamUserSaveActionTest extends
		AbstractBaseTransactionalSpringContextTests {
	/**
	 * 备注:此处可以使用Resource 和 Autowired 注解
	 */
	@Resource
	private ExamUserService examUserService;
	
	/**
	 * junit 4.0 以上版本的单元测试
	 */
	@Test
	public void execute(){

		ExamUser examUser = new ExamUser();
		
		examUser.setName("123456");
		examUser.setAge(0);
		
		examUserService.saveExamUser(examUser);
		
	}

}

 

备注: 运行后查看日志

INFO 2011-10-09 19:10:23,906 Loading XML bean definitions from class path resource [applicationContext.xml] [org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:323)] 
INFO 2011-10-09 19:10:24,312 Loading XML bean definitions from class path resource [cn/xxt/jsr250/action/beans.xml] [org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:323)] 
INFO 2011-10-09 19:10:24,375 Refreshing org.springframework.context.support.GenericApplicationContext@1820dda: display name [org.springframework.context.support.GenericApplicationContext@1820dda]; startup date [Sun Oct 09 19:10:24 CST 2011]; root of context hierarchy [org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:411)] 
INFO 2011-10-09 19:10:24,375 Bean factory for application context [org.springframework.context.support.GenericApplicationContext@1820dda]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1431340 [org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:426)] 
INFO 2011-10-09 19:10:24,484 Loading properties file from class path resource [frameworkconfig/jdbc/MySQL.properties] [org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:178)] 
INFO 2011-10-09 19:10:24,578 Loaded JDBC driver: com.mysql.jdbc.Driver [org.springframework.jdbc.datasource.DriverManagerDataSource.setDriverClassName(DriverManagerDataSource.java:155)] 
INFO 2011-10-09 19:10:25,406 Began transaction (1): transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@16f144c]; rollback [true] [org.springframework.test.context.transaction.TransactionalTestExecutionListener.startNewTransaction(TransactionalTestExecutionListener.java:259)] 
INFO 2011-10-09 19:10:25,484 Rolled back transaction after test execution for test context [[TestContext@c2b2f6 testClass = ExamUserSaveActionTest, locations = array<String>['classpath:/applicationContext.xml', 'classpath:/cn/xxt/jsr250/action/beans.xml'], testInstance = cn.xxt.jsr250.action.ExamUserSaveActionTest@737371, testMethod = execute@ExamUserSaveActionTest, testException = [null]]] [org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:279)] 
INFO 2011-10-09 19:10:25,500 Closing org.springframework.context.support.GenericApplicationContext@1820dda: display name [org.springframework.context.support.GenericApplicationContext@1820dda]; startup date [Sun Oct 09 19:10:24 CST 2011]; root of context hierarchy [org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:815)] 

 


 倒数第二行 执行了rolled back

且记:此处跟 数据库本身的事务隔离级别有关系,如mysql  设置的  innodb,会回滚,如果是myisam 不会回滚。同事可以看下数据库到底有没有增加记录。

 

 

总结:其实比较简单,五步区

(1)创建一个扩展自AbstractTransactionalJUnit4SpringContextTests的类,该基类是Spring2.5为方便在JUnit4环境进行事务测试的类,它还提供了一个simpleJdbcTemplate属性让你可以方便地操控数据库表,便于对测试数据进行有效的操作;
(2)用@ContextLocation注解指定你要加载的Spring配置信息所在的位置;(默认的加载文件信息请参阅Spring Documentation);
(3)用@Autowired或@Resource注解注入你的Service接口,@Autowrired是指按类型将Spring Bean注入;而@Resource则按名称将Spring Bean注入。
(4)用@Before准备待测试的数据,如果我们的数据库表结构没有任何数据,则可以在这里预先插入记录,以便进行单元测试,当整个测试完成后,这些数据都不会被保留在数据库中。
(5)在需要进行测试的方法上使用JUnit4.4提供的@Test注解进行标示;

分享到:
评论

相关推荐

    使用 Spring 2.5 TestContext 测试框架

    首先,Spring TestContext框架的核心是`@ContextConfiguration`注解,它用于指定测试类中应用上下文的配置。你可以通过此注解提供XML配置文件的位置,或者使用Java配置类。例如: ```java import org.spring...

    使用Spring2.5TestContext测试框架

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

    Spring 2.5 TestContext

    Spring 2.5 TestContext框架是Spring框架的一个重要组成部分,主要设计用于简化单元测试和集成测试的编写。这个框架提供了一种结构化的测试环境,它允许开发者在测试中利用Spring的依赖注入特性,以及对...

    Spring测试框架.rar

    TestContext框架是Spring测试支持的一部分,它提供了一个统一的测试上下文,可以加载Spring配置,并为测试注入依赖。以下是对Spring测试框架及其核心组件的详细说明: 1. **测试注解**:Spring测试框架利用注解简化...

    eclipse搭建spring2.5

    5. **测试**:创建一个JUnit测试类,使用Spring的TestContext框架来加载配置并运行测试。确保你的测试类继承了`AbstractJUnit4SpringContextTests`或`AbstractTestNGSpringContextTests`(取决于你使用的测试框架)...

    Spring2.5架构图

    10. **测试支持**:Spring 2.5 强化了测试框架,包括 `MockMVC` 和 `TestContext` 框架,使得单元测试和集成测试更加方便。 以上是 Spring 2.5 架构中的核心知识点,它们共同构建了一个强大且灵活的应用开发框架,...

    传智播客spring2.5 ppt

    Spring 2.5提供了一套完整的测试框架,包括单元测试和集成测试工具,如MockMVC和TestContext框架,使得测试Spring应用变得更加便捷。 9. **Web服务支持** Spring 2.5加强了对Web服务的支持,包括SOAP和RESTful...

    spring2.5 中文参考手册

    10. **单元测试和集成测试支持**:Spring提供了TestContext框架,使得编写和运行单元测试以及集成测试变得简单。 通过阅读这本中文参考手册,开发者可以深入了解Spring 2.5的各种功能,掌握如何使用Spring构建高...

    spring 2.5开发手册

    10. **测试支持**:Spring提供了丰富的测试工具和API,如Spring TestContext Framework,支持单元测试和集成测试,可以方便地进行依赖注入测试。 以上只是Spring 2.5中的一部分关键特性。在《Spring 2.5 开发手册》...

    spring2.5 api 完全参考手册chm api

    10. **测试支持**:Spring 2.5提供了全面的测试工具和API,如`Spring TestContext Framework`,使得单元测试和集成测试变得更加容易。 了解并熟练运用上述知识点,对于初学者来说,是快速掌握Spring框架的关键。...

    Spring2.5-中文参考手册

    8. **单元测试与集成测试支持**:Spring提供TestContext框架,支持Junit、Mockito等工具进行单元测试和集成测试,方便开发者编写和运行测试用例。 9. **Spring Expression Language (SpEL)**:SpEL是Spring提供的...

    springframework2.5源代码

    9. **集成测试**:Spring 2.5提供了方便的测试支持,如TestContext框架,使得集成测试变得简单。它允许在测试环境中轻松地加载ApplicationContext,并支持模拟bean和交易管理。 10. **Portlet MVC**:除了传统的Web...

    Spring 2.5 开发手册

    在测试方面,手册提供了关于单元测试和集成测试的指导,包括使用JUnit、Mockito等工具,以及Spring的TestContext框架,帮助开发者编写高质量的测试代码,确保软件的稳定性和可靠性。 最后,手册还包含了一些最佳...

    pro spring 2.5

    8. **单元测试与集成测试**:Spring提供了强大的测试支持,包括Mock对象、TestContext框架等,使得开发者能够编写高效的单元测试和集成测试。 9. **Spring Web Services**:2.5版本还支持创建和消费Web服务,包括...

    string 帮助手册(spring2.5)

    9. **测试支持**:Spring提供了一系列测试工具和API,方便进行单元测试和集成测试,包括Mock对象和TestContext框架。 10. **Spring Batch**:对于批量处理任务,Spring Batch提供了一套完整的解决方案,包括读取、...

    spring源代码2.5

    9. **集成测试**:Spring 2.5提供了更全面的测试支持,包括Mock对象、TestContext框架和`@RunWith(SpringJUnit4ClassRunner.class)`注解,便于进行单元测试和集成测试。 10. **国际化支持**:Spring 2.5加强了对...

    Spring Reference 2.5 中文

    8. **测试支持**:Spring提供了一套完整的测试框架,包括Mock对象、TestContext框架等,方便进行单元测试和集成测试。 9. **国际化(Internationalization,i18n)**:Spring通过MessageSource接口支持多语言环境,...

    Spring开发包

    在Spring 2.5中,可以通过Mock Objects和TestContext框架进行测试。 8. **Web服务**:Spring 2.5引入了对Web服务的支持,包括SOAP和RESTful风格的服务,提供了基于注解的WsdlFirst和ContractFirst两种开发模式。 9...

    spring2.5.6架包

    在2.5.6版本中,开发者可以使用Spring TestContext框架进行方便的依赖注入测试,同时支持Mockito等第三方库进行模拟对象测试。 7. **国际化和本地化**:Spring提供了对多语言环境的支持,可以在不同地区和语言环境...

Global site tag (gtag.js) - Google Analytics