Spring中DAO层接口的单元测试

标签: spring dao 接口 | 发表时间:2016-05-08 13:30 | 作者:xsylang
分享到:
出处:http://www.iteye.com
单元测试在软件开发流程中有着举足轻重的作用,良好的单元测试的作用跟重要性不需多言。基本上所有的java应用都会跟数据库打交道,DAO层接口的测试涉及到数据库测试数据的准备、维护、验证及清理。单元测试应该要具有可重复性、独立性,所以单元测试的数据不应该污染数据库。很多人在DAO层接口的单元测试中数据是自己手工插入的,第二次运行这个单测的时候就会得到duplicate key的错误,数据清理的过程中也是手工进行的,或者是通过try-catch-finally块进行清理,这自然是比较难以实现自动化测试的。其实,个人觉得,在spring框架中利用spring对事务管理的支持,可以很方便地实现DAO层接口测试的可重复性与隔离性。

实例说明
假设有一个Student表,现在要对StudentService类进行测试。持久层框架此处使用Mybatis,相关的类以及配置文件如下:
Student实体类:
public class Student {  
    private Integer id;  
  
    public Student(String name, String sex, Byte age, String tel) {  
        this.name = name;  
        this.sex = sex;  
        this.age = age;  
        this.tel = tel;  
    }  
  
    public Student() {  
  
    }  
  
    private String name;  
  
    private String sex;  
  
    private Byte age;  
  
    private String tel;  
  
    public Integer getId() {  
        return id;  
    }  
  
    public void setId(Integer id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name == null ? null : name.trim();  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex == null ? null : sex.trim();  
    }  
  
    public Byte getAge() {  
        return age;  
    }  
  
    public void setAge(Byte age) {  
        this.age = age;  
    }  
  
    public String getTel() {  
        return tel;  
    }  
  
    public void setTel(String tel) {  
        this.tel = tel == null ? null : tel.trim();  
    }  
}  

StudentMapper接口:
public interface StudentMapper {  
    int insert(Student record);  
  
    Student selectByPrimaryKey(Integer id);  
  
    int updateByPrimaryKey(Student record);  
}  

StudentService服务接口:
public interface StudentService {  
    public Student getStudentsById(int StudentsId);  
    public int insertStudent(Student s);  
    public void updateStudent(Student s);  
}  

StudentServiceImpl接口实现:
public class StudentServiceImpl implements StudentService {  
  
    @Autowired  
    private StudentMapper studentMapper;  
    public Student getStudentsById(int StudentsId) {  
        return studentMapper.selectByPrimaryKey(StudentsId);  
    }  
  
    public int insertStudent(Student s) {  
        return studentMapper.insert(s);  
    }  
  
    public void updateStudent(Student s) {  
        studentMapper.updateByPrimaryKey(s);  
    }  
}  

单元测试:
@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"classpath:spring.xml"})  
@Transactional  
@Rollback(true)  
public class StudentServiceTest {  
  
    @Autowired  
    private StudentService studentService;  
  
    @Test  
    public void testInsertStudent() {  
        Student s = new Student("test", "male", (byte) 23, "110");  
        studentService.insertStudent(s);  
        Assert.assertEquals(studentService.getStudentsById(s.getId()).getName(),"test");  
        Assert.assertEquals(studentService.getStudentsById(s.getId()).getAge().intValue(), 23);  
    }  
  
    @Test  
    public void testUpdateStudent() {  
        Student s = new Student("test", "male", (byte) 23, "110");  
        studentService.insertStudent(s);  
        Assert.assertEquals(studentService.getStudentsById(s.getId()).getName(),"test");  
        Assert.assertEquals(studentService.getStudentsById(s.getId()).getAge().intValue(), 23);  
  
        s.setAge((byte)25);  
        s.setName("test2");  
        studentService.updateStudent(s);  
        Assert.assertEquals(studentService.getStudentsById(s.getId()).getName(),"test2");  
        Assert.assertEquals(studentService.getStudentsById(s.getId()).getAge().intValue(), 25);  
    }  
}  

@Transactional注释标签在此测试类中启用了事务支持,这样所有的测试执行完后都会自动回滚,不会在数据库中产生脏数据,不用自己清除所做的任何对数据库的变更了。
@Rollback(true)设置事务回滚,其实默认@Transactional注释defaultRollback是默认为true的,此处不加也可以。
执行结果如下图所示 :



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring dao 接口] 推荐:

Spring中DAO层接口的单元测试

- - 研发管理 - ITeye博客
单元测试在软件开发流程中有着举足轻重的作用,良好的单元测试的作用跟重要性不需多言. 基本上所有的java应用都会跟数据库打交道,DAO层接口的测试涉及到数据库测试数据的准备、维护、验证及清理. 单元测试应该要具有可重复性、独立性,所以单元测试的数据不应该污染数据库. 很多人在DAO层接口的单元测试中数据是自己手工插入的,第二次运行这个单测的时候就会得到duplicate key的错误,数据清理的过程中也是手工进行的,或者是通过try-catch-finally块进行清理,这自然是比较难以实现自动化测试的.

利用JUnit和Spring-test对SpringJDBC组件DAO层测试

- - ITeye博客
借着学习Druid连接池的机会,使用的Spring,将知识点联系起来,简单写了一个利用JUnit和Spring-test对SpringJDBC组件DAO层测试的Demo,分类归在Spring中吧. SpringJDBC组件是Spring提供的一个对底层JDBC的封装,扩展了更多更方便的接口,方便我们对数据库的操作.

Spring中Aware相关接口

- - 企业架构 - ITeye博客
加载Spring配置文件时,如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的. 方法,获得ApplicationContext对象. 前提必须在Spring配置文件中指定该类.

使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件 - Balla_兔子

- - 博客园_首页
  Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件. 关于Mybatis-Generator的下载可以到这个地址: https://github.com/mybatis/generator/releases.

Spring MVC 和 Struts2

- - CSDN博客架构设计推荐文章
Web层面的框架学习了三个Struts1和2,SpringMVC,那他们之间肯定存在一个优劣和适用的环境,Struts1和2的异同点我已经做过对比《 Struts1和Struts2》,这篇将对比下Struts2和SpringMVC的异同,下面数据基本来源于网络,本人是搜集整理所得,供大家参考. 一个项目使用什么样的技术,决定的因素很多,我所能想到的有:对系统的性能、开发的效率、团队学习的成本、业务场景等,下面尽量从这几个方面入手,来分析比较下他们之间存在的优劣.

Spring详解

- - CSDN博客架构设计推荐文章
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.. PersonDaoBean 是在应用内部创建及维护的. 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.

Spring定时

- - 行业应用 - ITeye博客
spring的定时任务配置分为三个步骤:. <!--要定时执行的方法-->. <!--指定要定时执行的方法所在类,将定时任务定义成bean-->. <!--指定定时执行的方法-->. <!--指定目标封装为有状态的任务,有状态的任务不能并发执行,无状态的任务可并发执行-->.

简单Spring+hessian

- - Web前端 - ITeye博客
简单的Spring+hessian. dist\modules里面的 spring-webmvc.jar . lib\caucho 里面的hessian-3.1.3.jar. 里面有个接口interface:. 建立一个model层:(实现Serializable接口). 在WEB-INF下面创建一个remoting-servlet.xml:.

spring roo 入门

- - 企业架构 - ITeye博客
Spring官网下载STS(如果没有STS). 创建Spring Roo基础项目. 根 据ROO的提示输入jpa setup再按ctrl+space,很遗憾这个快捷键已经被输入法切换占用,不能借助提示输入命令,但我们可以打开ROO命令向导,这里我们输入jpa 可以查到这条命令的用法,根据提示增加provider和database选项来完成命令.

Spring Rmi配置

- - 企业架构 - ITeye博客
现在远程调用一般用RPC,webservice或者Rmi,而目前用的比较多的是webservice和Rmi. webservice和rmi的最主要的区别,rmi的客户端和服务端都必须是java,webservice没有这个限制,webservice是在http协议上传递xml文本文件. 与语言和平台无关,rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言.