您的位置:首页 > 编程语言 > Java开发

基于Spring的可复用的Junit测试类的设计

2015-01-10 00:20 477 查看
            平时我们做SSH项目的时候避免不了要做单元测试,而且很多时候,我们是不希望单元测试的结果对真正的数据库有影响的,那么我们就需要使用事务来管理了。

           JUnit测试基类如下:

package com.sms.test.base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;

/**
* 1.指定测试用例运行器
*/
@RunWith(SpringJUnit4ClassRunner.class)
/**
* 2.事务配置
* transactionManager="这里是applicationContext.xml文件中事务管理器的名称,默认是transactionManager"
* defaultRollback=true 事务执行后是回滚还是提交,如果不希望测试用数据留在数据库中,可以设置为true
*/
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
/**
* 3.注册测试用例的监听器
* 加入TransactionalTestExecutionListener后,它负责解析 @Transactional、@NotTransactional以及 @Rollback 等事务注解的注解
* @Transaction 注解让测试方法工作于事务环境中,不过在测试方法返回前事务会被回滚。你可以使用 @Rollback(false)
* 让测试方法返回前提交事务。而 @NotTransactional注解则让测试方法不工作于事务环境中。
* 加入DependencyInjectionTestExecutionListener后,可以识别@Autowired,本类的属性名与applicationContext中bean
* id或name相同,则Autowired
*/
@TestExecutionListeners({ TransactionalTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class })
/**
* 使测试用例的所有方法都将工作于事务环境下
*/
@Transactional
/**
* 4.上下文配置
* locations:指定applicationContext.xml文件的路径,可以通过该属性手工指定 Spring
* 配置文件所在的位置,可以指定一个或多个 Spring
* 配置文件@ContextConfiguration(locations={“xx/yy/beans1.xml”,” xx/yy/beans2.xml”})
* inheritLocations:是否要继承父测试用例类中的Spring配置文件,默认为 true
*/
@ContextConfiguration(locations = { "classpath*:ApplicationContext.xml" })
public abstract class AbstractTransactionalSpringContextTest extends
AbstractTransactionalJUnit4SpringContextTests {
}


有了这个我们就可以使用Junit时也不用自己再从Spring'的Ioc容器里面用getBean方法来取得我们想要Bean了。可以直接像项目里面使用下面的代码了:
@Resource
public ClassDao classDaoImpl;

但是,还有一个问题,我们在dao层和service的测试很多时候都是用一个实体的,那么我们还可以把实体给抽象到父类,如下:
public class GradeTestUtil extends AbstractTransactionalSpringContextTest{
public GradeEntity grade;
public GradeTestUtil(){
grade = new GradeEntity();
grade.setCode(1);
grade.setGradeName("gradeName");
grade.setRemark("remark");
}
}

最后测试时就只剩下下面一点代码要写而已了:
public class GradeDaoImplTest extends GradeTestUtil{
@Resource
public GradeDao gradeDaoImpl;

@Test
@Rollback
public void save() throws Exception{
gradeDaoImpl.add(grade);
}


而且在成功运行时会自动进行事务回滚,不会对数据库产生影响
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring junit