首页 > 代码库 > 基于Spring的可复用的Junit测试类的设计

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

            平时我们做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测试类的设计