`
xsylang
  • 浏览: 20159 次
文章分类
社区版块
存档分类
最新评论

Spring中DAO层接口的单元测试

阅读更多
单元测试在软件开发流程中有着举足轻重的作用,良好的单元测试的作用跟重要性不需多言。基本上所有的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的,此处不加也可以。
执行结果如下图所示 :

  • 大小: 101.3 KB
分享到:
评论

相关推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring.3.x企业应用开发实战(完整版).part2

    2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring+3.x企业应用开发实战光盘源码(全)

     第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。  第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及...

    Spring3.x企业应用开发实战(完整版) part1

    2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇...

    Spring事务优缺点及使用详解.docx

    定义dao接口对应的sql映射文件 o6. 定义异常类 o7. 定义service接口及实现类 o8. mybatis.xml o9. Spring配置文件 o10. 测试 三、使用 Spring 的事务注解管理事务 o1. 声明事务管理器 o2. 开启注解驱动 o3. 完整...

    Spring 2.0 开发参考手册

    8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    13.7.5 调查结果DAO接口SurveyChildCountDAO.java 13.7.6 用户DAO实现类UserDAOImpl.java 13.7.7 调查题目DAO实现类SurveyDAOImpl.java 13.7.8 调查项目DAO实现类SurveyOptionDAOImpl.java 13.7.9 调查子项目DAO实现...

    spring4.3.9相关jar包

    spring-context.jar(必须):这个jar 文件在基础IOC功能上为Spring 核心提供了大量扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    13.7.5 调查结果DAO接口SurveyChildCountDAO.java 13.7.6 用户DAO实现类UserDAOImpl.java 13.7.7 调查题目DAO实现类SurveyDAOImpl.java 13.7.8 调查项目DAO实现类SurveyOptionDAOImpl.java 13.7.9 调查子项目DAO实现...

    Spring-generator一键生成数据库文件

    Spring-generator 是基于 javafx8 开发的图形界面 Spring 代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将数据库中的表生成为任意风格的 .java 代码文件(比如经典的三层模型)。 Spring-...

    spring chm文档

    8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    13.7.5 调查结果DAO接口SurveyChildCountDAO.java 13.7.6 用户DAO实现类UserDAOImpl.java 13.7.7 调查题目DAO实现类SurveyDAOImpl.java 13.7.8 调查项目DAO实现类SurveyOptionDAOImpl.java 13.7.9 调查子项目DAO实现...

    Spring攻略(第二版 中文高清版).part1

    13.4 管理集成测试中的应用上下文 520 13.4.1 问题 520 13.4.2 解决方案 520 13.4.3 工作原理 521 13.5 向集成测试注入测试夹具 526 13.5.1 问题 526 13.5.2 解决方案 526 13.5.3 工作原理 527 13.6...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。  第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及...

    Spring集成MyBatis.docx

    四、创建dao接口 五、定义映射文件mapper 六、创建mybatis主配置文件 七、创建Service接口和实现类,属性是dao 八、创建spring的配置文件 九、创建测试类 十、总结 将 MyBatis与 Spring 进行整合,...

    Spring攻略(第二版 中文高清版).part2

    13.4 管理集成测试中的应用上下文 520 13.4.1 问题 520 13.4.2 解决方案 520 13.4.3 工作原理 521 13.5 向集成测试注入测试夹具 526 13.5.1 问题 526 13.5.2 解决方案 526 13.5.3 工作原理 527 13.6...

    Maven整合ssm框架.zip

    注意:dao层只有接口。 3.创建dao层与之对象的mapper.xml配置文件 4.创建mybatis的核心配置文件。 5.通过api执行mybatis 5.1 获取mybatis核心配置的io流对象 5.2 创建SqlSessionFactory对象 5.3 创建...

    基于springboot和docker部署的微服务架构.zip

    通过dao层接口映射到api接口,类似于ws,可以查看所有的接口列表及类型 @RestController+@RequestMapping("/expresses") http://localhost:8080/expresses/1 常规rest,推荐 也可以使用hateoas来实现超媒体的rest...

Global site tag (gtag.js) - Google Analytics