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

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 MVC junit 单元测试(controller)

    在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...

    Struts+Spring框架下的单元测试[总结].pdf

    在`LoginManagerService`中,`login`方法接收`HttpServletRequest`作为参数,这在单元测试中并不常见,因为通常建议将依赖于HTTP请求的数据通过方法参数传递,以简化测试。但是,为了测试,可以构造一个包含必要参数...

    使用Spring实现DAO模式

    通过定义接口和实现类,可以在配置文件中指定依赖关系,而无需在代码中硬编码,从而增强了系统的可测试性和可维护性。 #### 3. 实现示例 假设我们需要开发一个图书馆管理系统,涉及对书籍的管理,包括查询、借阅等...

    spring boot服务器dao层实例化.rar_dao实例化_idea 实例ID_spring boot_spring b

    在Spring框架中,DAO接口通常用于定义数据访问的方法,而其对应的实现类则负责具体的数据库操作。Spring Boot通过依赖注入(Dependency Injection, DI)来管理这些DAO对象,使得它们可以在需要时自动被创建和初始化...

    spring几种Dao支持配置

    Spring提供了`TestContext`框架,使得DAO可以在内存数据库(如HSQLDB)中进行单元测试,无需实际连接到生产数据库。 10. **Spring Data:** Spring Data是Spring提供的一个高度抽象的库,它简化了数据访问层的...

    Spring支持DAO需要的jar包

    Spring以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力,简化了Java应用的复杂性,特别是对于数据访问层(DAO,Data Access Object)的管理。本文将详细...

    Service层和DAO层解析

    Spring框架通过依赖注入(Dependency Injection,DI)实现了这一目标,使得Service层可以通过接口引用DAO层的实现,而不是直接创建DAO实例。这增强了系统的可测试性和可扩展性,因为Service层可以通过配置文件或注解...

    Spring3 JDBC 通用DAO封装2 dao层终于完成dao层大概上传完整代码

    使用JUnit和Spring Test进行单元测试,验证DAO层的功能正确性。 通过上述步骤,我们可以构建一个高效、可复用的Spring3 JDBC通用DAO层。在实际项目中,可以结合Spring的其他功能,如MyBatis、Hibernate等ORM框架,...

    spring3学习笔记(2)-集成ibatis3进行单元测试

    3. 测试事务管理:由于iBatis和Spring都是事务管理的,我们需要在测试中模拟事务的提交和回滚。可以使用Spring的`@Transactional`注解来开启和关闭事务。 4. 断言(Assertion):使用JUnit提供的assert方法,如...

    SpringDao模式实例

    8. **Unit Testing**: Spring提供了一些工具,如`@TransactionalTest`注解和`MockMvc`,方便对DAO层进行单元测试,确保代码质量。 在实际应用中,Spring DAO模式的实现通常会结合使用上述组件,通过配置文件(XML或...

    经典spring关于关于dao模式的开发案例

    7. **单元测试**:Spring的TestContext框架使得编写DAO层的单元测试变得简单,可以模拟数据源并注入到测试类中,进行隔离的测试。 8. **依赖注入**:通过Spring的IoC容器,可以将数据源、SessionFactory或...

    Spring+myBatis 整合两种方法,一种是dao 整合,一种是mapper接口代理

    本教程将详细介绍如何将Spring与MyBatis进行整合,包括两种不同的方法:DAO整合和Mapper接口代理。 首先,我们需要搭建基本的项目环境。项目结构通常包括`.classpath`、`.project`等IDE配置文件,`src`源代码目录,...

    mongoDB DAO层封装

    在这个项目中,我们主要基于MongoDB 3.0版本和Spring Data 1.5进行整合,实现了DAO层的封装。下面将详细解释这些关键知识点。 1. MongoDB MongoDB是一个流行的开源文档型数据库,它采用了NoSQL的数据模型,以JSON...

    web应用dao层的开发经验小结

    DAO模式通常结合工厂模式或接口实现,例如使用DAO接口定义操作规范,然后通过具体实现类完成具体的数据库操作。这种设计允许灵活地切换不同的数据存储技术,如MySQL、Oracle或NoSQL数据库。 3. SQL与动态SQL - ...

    省略dao层,采用全注解完成登录功能

    在本项目中,"省略DAO层,采用全注解完成登录功能"是一个创新的实践,旨在简化传统的Java Web开发中的数据访问层(DAO层)结构。DAO层通常用于处理数据库交互,但在本示例中,我们将看到如何利用Java的注解技术来减少...

    spring3 + mybatis3 + junit4 可运行项目示例

    这个项目的核心是利用Spring作为应用的ioc(Inversion of Control,控制反转)和aop(Aspect Oriented Programming,面向切面编程)容器,MyBatis作为持久层框架,以及JUnit4用于进行单元测试和集成测试。...

    Hibernate封装dao层

    创建一个DAO接口,定义所有需要的方法,然后创建一个实现该接口的类,如`UserDaoImpl`,在这个实现类中使用Hibernate API完成实际的数据库操作。 5. **泛型DAO**: 为了进一步提高代码的复用性,可以使用泛型来...

Global site tag (gtag.js) - Google Analytics