Spring 注解学习手札(六) 测试
既然系统基于注解自成一体,那么基于Spring的测试是否可以依赖注解轻松完成呢?坚决地没问题!
Spring-Test义不容辞的完成了这个任务!并且,通过Spring-Test的事务会滚控制,我们可以在不污染数据库数据的前提下进行业务测试!
完成这项内容,本次Spring 注解学习手札整理就正式落幕了!
感谢大家的关注!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
这里将用到以下几个包:
/** * 2009-12-16 */package org.zlex.spring;import org.junit.runner.RunWith;import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.transaction.TransactionConfiguration;import org.springframework.transaction.annotation.Transactional;/** * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> * @version 1.0 * @since 1.0 */@ContextConfiguration(locations = "classpath:applicationContext.xml")@RunWith(SpringJUnit4ClassRunner.class)@Transactional@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)public abstract class AbstractTestCase extendsAbstractTransactionalDataSourceSpringContextTests {}
让每一个测试类都写一堆配置忒麻烦!
索性来个老爹替子子孙孙都完成基础工作!
逐行分析:
@ContextConfiguration(locations = "classpath:applicationContext.xml")导入配置文件。这时候,我们可以看出之前使用applicationContext.xml文件作为系统总控文件的好处!
当然,Spring-Test的这个配置只认classpath,很无奈,我必须拷贝这些文件到根目录!
@RunWith(SpringJUnit4ClassRunner.class)SpringJUnit支持,由此引入Spring-Test框架支持!
@Transactional这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
AbstractTransactionalDataSourceSpringContextTests要想构建这一系列的无污染纯绿色事务测试框架就必须找到这个基类!
给出一个整体结构图:
test子目录下的文件将编译到classpath下,这其实还同时是个maven测试项目!拷一堆配置文件的确有些不方便!
AbstractTestCase.java用于抽象测试类控制。
AccountDaoTest.java用于AccountDao测试。
DaoAllTests.java用于Dao层的整体测试。
来看看AccountDaoTest
AccountDaoTest.java
/** * 2009-12-16 */package org.zlex.spring;import java.util.Date;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.zlex.spring.dao.AccountDao;import org.zlex.spring.domain.Account;/** * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> * @version 1.0 * @since 1.0 */public class AccountDaoTest extends AbstractTestCase {@Autowiredprivate AccountDao accountDao;@Testpublic void test() {Account ac = new Account();ac.setBirthday(new Date());ac.setUsername("SPRING");ac.setPassword("SNOWOLF");ac.setEmail("spring@zlex.org");// 创建用户accountDao.create(ac);// 检索Account account = accountDao.read("SPRING");// 校验assertNotNull(account);}}
当然,这时候你要看看数据库是不是真的插入了一条数据!
实际上这是一个未提交的事务!

/** * 2009-12-17 */package org.zlex.spring;import org.junit.runner.RunWith;import org.junit.runners.Suite;import org.junit.runners.Suite.SuiteClasses;/** * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> * @version 1.0 * @since 1.0 */@RunWith(Suite.class)@SuiteClasses( { AccountDaoTest.class, AccountDaoTest.class })public class DaoAllTests {}