平时我们做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 { }
@Resource public ClassDao classDaoImpl;
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); }
原文地址:http://blog.csdn.net/kklt21cn/article/details/42567399