Java单元测试Junit(五)使用Spring TestContext测试Spring应用
2016-03-21 16:43
211 查看
什么是Spring TestContext?
Spring TestContext是Spring提供的一套基于注解的Test框架,Spring TestContext有非常好的兼容性,可以无缝兼容JUnit,TestNG等单元测试框架,而且在其基础上增加更多的功能
Spring TestContext为我们带来什么?
在Spring应用大行其道的今天,使用Spring来构建应用已经是再普通不过的事情,但当使用JUnit,TestNG等传统的单元测试技术和Spring进行结合的时候,就会出现很多并不如意的事情
1.Spring容器初始化问题:此问题已于JUnit4中被解决,通过使用@BeforeClass
可以有效防止Spring容器被多次初始化的问题
2.硬编码获取Bean:此问题是由于JUnit并不兼容Spring,所以当单元测试运行
的时候,无法解释Spring独有的注解,从而需要使用硬编码来获取Bean
3.数据现场破坏:JUnit当中可以使用DBUnit来进行数据现场维护的解决方案,
详情可以通过笔者的DBUnit使用了解DBUnit,Spring TestContext通过AOP
声明式事务来对单元测试进行回滚,有效的解决了数据现场的问题
4.事务:通常我们的单元测试都需要和数据库进行交互,但传统的JUnit的
组成单元为TestCase,并不存在事务的概念,而我们大多数情况下都需要
观察事务的执行过程或总体的性能,特别是对长事务模块的测试,
Spring TestContext允许单元测试支持事务的控制
Spring TestContext使用:
首先为Maven增加Spring的依赖,由于Spring有众多依赖,这里就不给出代码了
以下为Spring TestContext的代码
package com.accentrix.ray;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.ExpectedException;
import org.springframework.test.annotation.Repeat;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.annotation.Timed;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.transaction.AfterTransaction;
import org.springframework.test.context.transaction.BeforeTransaction;
import com.accentrix.vtc.hpp.entity.planning.User;
import com.accentrix.vtc.hpp.unit.dao.UserDao;
//指定Spring配置文件位置
@ContextConfiguration(locations = "/applicationContext-test.xml")
/*
* 配置事务是使用哪个事务管理器和默认是否回滚,通常继承
* AbstractTransactionalJUnit4SpringContextTests后不需配置
* @TransactionConfiguration(defaultRollback = true,transactionManager="test")
*/
public class SpringTest extends AbstractTransactionalJUnit4SpringContextTests{
// 可以直接使用Spring Annotation的方式注入
@Autowired
private UserDao userDao;
private User user;
// 当有某些操作不想在包含在事务,希望在事务前执行时,使用@BeforeTransaction
@BeforeTransaction
public void beforeTransaction() {
System.out.println("Hello ");
}
/*
* 由于继承了AbstractTransactionalJUnit4SpringContextTests,
* 此时JUnit就拥有了事务控制,@Before和@After都会包含在事务当中
*/
@Before
public void setUp() {
System.out.println(userDao);
// 在开始前先插入测试数据
user = new User(1, "Ray", "123");
userDao.add(user);
/*
* 此时使用Spring Test的就需要注意,因为 Hibernate会将HQL或SQL语句进行缓存,所以
* 这里若然DAO是使用Hibenrate,需要使用flush
*/
userDao.getSession().flush();
}
@Test
@ExpectedException(RuntimeException.class) // ①
@Timed(millis = 1000) // ②
@Repeat(100) // ③
@Rollback(false) // ④
public void testMain() {
throw new RuntimeException();
}
@After
public void tearDown() {
// 最后删除测试数据
userDao.delete(user);
}
// 当有某些操作不想在包含在事务,希望在事务后执行时,使用@AfterTransaction
@AfterTransaction
public void afterTrasaction() {
System.out.println("World");
}
}
请留意上面代码中testMain上的4个注解
@ExpectedException:此形式和@Test(expected=RuntimeException.class)一样,表示该单元测试应该抛出RuntimeException的错误,否者测试不通过,但建议使用JUnit提供的
@Timed:Timed和@Test(timeout=1000)有所不同的,@Test(timeout=1000)代表被注解的方法单体执行超过1秒就会测试失败,但@Timed()为测试整个事务从开始到执行testMain再结束的总耗时,而且会把@Repeat的重复也计算在总耗时内
@Repeat:Repeat代表此方法将会重复执行100次,注意,会重复执行@Before和@After方法
@Rollback:这里是Spring TestContext我认为最大的魅力所在,只需一行简单的注解就可以实现控制回滚操作,此时可以覆盖基类中回滚默认为true的限制,可以控制是否回滚事务, true为回滚,false为不回滚
@NotTransaction:请注意这个注解,在2.5版本此注解为声明该单元测试不需要事务支持,但在3.0版本后认为单元测试当中应该都要有事务控制,所以此注解已被Deprecated(不建议再使用)
除此以外Spring TestContext还提供了很多方便的操作让我们使用
public void testMain() {
//获取ApplicationContext对象
ApplicationContext ac = super.applicationContext;
//获取SimpleJdbcTemplate实现
SimpleJdbcTemplate simpleJdbcTemplate= super.simpleJdbcTemplate;
//获取某table的总行数
super.countRowsInTable("t_user");
//执行某份外部的sql文件,true为当发生错误时仍然继续执行
super.executeSqlScript("D:/execute.sql", true);
//快速删除某张表的全部记录
super.deleteFromTables("t_test");
}
Spring
TestContext使用极其简单,通过简单的注解就能扩展JUnit单元测试,弥补了JUnit在测试Spring应用时的不足和空白,还可以使用Spring自身的注解对依赖进行注入,简化了此前每次获取Bean的烦恼,在Spring应用中请毫不犹疑的使用Spring Test,在Spring TestContext当中除了支持JUnit4以外,还支持JUnit3.8,TestNG等,只需将单元测试类分别继承AbstractTransactionalJUnit38SpringContextTests和AbstractTransactionalTestNGSpringContextTests即可,
Spring TestContext是Spring提供的一套基于注解的Test框架,Spring TestContext有非常好的兼容性,可以无缝兼容JUnit,TestNG等单元测试框架,而且在其基础上增加更多的功能
Spring TestContext为我们带来什么?
在Spring应用大行其道的今天,使用Spring来构建应用已经是再普通不过的事情,但当使用JUnit,TestNG等传统的单元测试技术和Spring进行结合的时候,就会出现很多并不如意的事情
1.Spring容器初始化问题:此问题已于JUnit4中被解决,通过使用@BeforeClass
可以有效防止Spring容器被多次初始化的问题
2.硬编码获取Bean:此问题是由于JUnit并不兼容Spring,所以当单元测试运行
的时候,无法解释Spring独有的注解,从而需要使用硬编码来获取Bean
3.数据现场破坏:JUnit当中可以使用DBUnit来进行数据现场维护的解决方案,
详情可以通过笔者的DBUnit使用了解DBUnit,Spring TestContext通过AOP
声明式事务来对单元测试进行回滚,有效的解决了数据现场的问题
4.事务:通常我们的单元测试都需要和数据库进行交互,但传统的JUnit的
组成单元为TestCase,并不存在事务的概念,而我们大多数情况下都需要
观察事务的执行过程或总体的性能,特别是对长事务模块的测试,
Spring TestContext允许单元测试支持事务的控制
Spring TestContext使用:
首先为Maven增加Spring的依赖,由于Spring有众多依赖,这里就不给出代码了
以下为Spring TestContext的代码
package com.accentrix.ray;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.ExpectedException;
import org.springframework.test.annotation.Repeat;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.annotation.Timed;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.transaction.AfterTransaction;
import org.springframework.test.context.transaction.BeforeTransaction;
import com.accentrix.vtc.hpp.entity.planning.User;
import com.accentrix.vtc.hpp.unit.dao.UserDao;
//指定Spring配置文件位置
@ContextConfiguration(locations = "/applicationContext-test.xml")
/*
* 配置事务是使用哪个事务管理器和默认是否回滚,通常继承
* AbstractTransactionalJUnit4SpringContextTests后不需配置
* @TransactionConfiguration(defaultRollback = true,transactionManager="test")
*/
public class SpringTest extends AbstractTransactionalJUnit4SpringContextTests{
// 可以直接使用Spring Annotation的方式注入
@Autowired
private UserDao userDao;
private User user;
// 当有某些操作不想在包含在事务,希望在事务前执行时,使用@BeforeTransaction
@BeforeTransaction
public void beforeTransaction() {
System.out.println("Hello ");
}
/*
* 由于继承了AbstractTransactionalJUnit4SpringContextTests,
* 此时JUnit就拥有了事务控制,@Before和@After都会包含在事务当中
*/
@Before
public void setUp() {
System.out.println(userDao);
// 在开始前先插入测试数据
user = new User(1, "Ray", "123");
userDao.add(user);
/*
* 此时使用Spring Test的就需要注意,因为 Hibernate会将HQL或SQL语句进行缓存,所以
* 这里若然DAO是使用Hibenrate,需要使用flush
*/
userDao.getSession().flush();
}
@Test
@ExpectedException(RuntimeException.class) // ①
@Timed(millis = 1000) // ②
@Repeat(100) // ③
@Rollback(false) // ④
public void testMain() {
throw new RuntimeException();
}
@After
public void tearDown() {
// 最后删除测试数据
userDao.delete(user);
}
// 当有某些操作不想在包含在事务,希望在事务后执行时,使用@AfterTransaction
@AfterTransaction
public void afterTrasaction() {
System.out.println("World");
}
}
请留意上面代码中testMain上的4个注解
@ExpectedException:此形式和@Test(expected=RuntimeException.class)一样,表示该单元测试应该抛出RuntimeException的错误,否者测试不通过,但建议使用JUnit提供的
@Timed:Timed和@Test(timeout=1000)有所不同的,@Test(timeout=1000)代表被注解的方法单体执行超过1秒就会测试失败,但@Timed()为测试整个事务从开始到执行testMain再结束的总耗时,而且会把@Repeat的重复也计算在总耗时内
@Repeat:Repeat代表此方法将会重复执行100次,注意,会重复执行@Before和@After方法
@Rollback:这里是Spring TestContext我认为最大的魅力所在,只需一行简单的注解就可以实现控制回滚操作,此时可以覆盖基类中回滚默认为true的限制,可以控制是否回滚事务, true为回滚,false为不回滚
@NotTransaction:请注意这个注解,在2.5版本此注解为声明该单元测试不需要事务支持,但在3.0版本后认为单元测试当中应该都要有事务控制,所以此注解已被Deprecated(不建议再使用)
除此以外Spring TestContext还提供了很多方便的操作让我们使用
public void testMain() {
//获取ApplicationContext对象
ApplicationContext ac = super.applicationContext;
//获取SimpleJdbcTemplate实现
SimpleJdbcTemplate simpleJdbcTemplate= super.simpleJdbcTemplate;
//获取某table的总行数
super.countRowsInTable("t_user");
//执行某份外部的sql文件,true为当发生错误时仍然继续执行
super.executeSqlScript("D:/execute.sql", true);
//快速删除某张表的全部记录
super.deleteFromTables("t_test");
}
Spring
TestContext使用极其简单,通过简单的注解就能扩展JUnit单元测试,弥补了JUnit在测试Spring应用时的不足和空白,还可以使用Spring自身的注解对依赖进行注入,简化了此前每次获取Bean的烦恼,在Spring应用中请毫不犹疑的使用Spring Test,在Spring TestContext当中除了支持JUnit4以外,还支持JUnit3.8,TestNG等,只需将单元测试类分别继承AbstractTransactionalJUnit38SpringContextTests和AbstractTransactionalTestNGSpringContextTests即可,
相关文章推荐
- Junit与spring TestContext框架整合
- 搭建企业级单元测试环境-Spring集成JUnit4/TestNG
- 使用Spring MVC统一异常处理实战
- 使用spring @Scheduled注解执行定时任务、
- 【spring】使用spring 获取指定包下面的bean
- Spring基于注解TestContext 测试框架使用详解
- Spring TestContext Framework对JUnit4和TestNG的集成支持详解
- 根据request,上传文件(使用Spring CommonsMultipartResolver 上传文件)
- Java中的包装类
- springMVC—接受参数以及返回参数
- Java单元测试Junit(四)使用Cactus测试Servlet
- Java开发常用工具
- 用java实现编译器之有限状态机驱动的整形,浮点型数值识别器
- Java单元测试Junit(三)使用EasyMock扩展Junit
- 32位整形数转化为IP地址
- Java单元测试Junit(二)使用DBUnit扩展JUnit
- Spring与Quartz的整合实现定时任务调度
- java 二叉搜索树寻找最小跟结点
- Java多线程系列--“JUC锁”04之 公平锁(二)
- java安全(六) 终极武器数据证书