单元测试在软件开发流程中有着举足轻重的作用,良好的单元测试的作用跟重要性不需多言。基本上所有的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框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...
在`LoginManagerService`中,`login`方法接收`HttpServletRequest`作为参数,这在单元测试中并不常见,因为通常建议将依赖于HTTP请求的数据通过方法参数传递,以简化测试。但是,为了测试,可以构造一个包含必要参数...
通过定义接口和实现类,可以在配置文件中指定依赖关系,而无需在代码中硬编码,从而增强了系统的可测试性和可维护性。 #### 3. 实现示例 假设我们需要开发一个图书馆管理系统,涉及对书籍的管理,包括查询、借阅等...
在Spring框架中,DAO接口通常用于定义数据访问的方法,而其对应的实现类则负责具体的数据库操作。Spring Boot通过依赖注入(Dependency Injection, DI)来管理这些DAO对象,使得它们可以在需要时自动被创建和初始化...
Spring提供了`TestContext`框架,使得DAO可以在内存数据库(如HSQLDB)中进行单元测试,无需实际连接到生产数据库。 10. **Spring Data:** Spring Data是Spring提供的一个高度抽象的库,它简化了数据访问层的...
Spring以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力,简化了Java应用的复杂性,特别是对于数据访问层(DAO,Data Access Object)的管理。本文将详细...
Spring框架通过依赖注入(Dependency Injection,DI)实现了这一目标,使得Service层可以通过接口引用DAO层的实现,而不是直接创建DAO实例。这增强了系统的可测试性和可扩展性,因为Service层可以通过配置文件或注解...
使用JUnit和Spring Test进行单元测试,验证DAO层的功能正确性。 通过上述步骤,我们可以构建一个高效、可复用的Spring3 JDBC通用DAO层。在实际项目中,可以结合Spring的其他功能,如MyBatis、Hibernate等ORM框架,...
3. 测试事务管理:由于iBatis和Spring都是事务管理的,我们需要在测试中模拟事务的提交和回滚。可以使用Spring的`@Transactional`注解来开启和关闭事务。 4. 断言(Assertion):使用JUnit提供的assert方法,如...
8. **Unit Testing**: Spring提供了一些工具,如`@TransactionalTest`注解和`MockMvc`,方便对DAO层进行单元测试,确保代码质量。 在实际应用中,Spring DAO模式的实现通常会结合使用上述组件,通过配置文件(XML或...
7. **单元测试**:Spring的TestContext框架使得编写DAO层的单元测试变得简单,可以模拟数据源并注入到测试类中,进行隔离的测试。 8. **依赖注入**:通过Spring的IoC容器,可以将数据源、SessionFactory或...
本教程将详细介绍如何将Spring与MyBatis进行整合,包括两种不同的方法:DAO整合和Mapper接口代理。 首先,我们需要搭建基本的项目环境。项目结构通常包括`.classpath`、`.project`等IDE配置文件,`src`源代码目录,...
在这个项目中,我们主要基于MongoDB 3.0版本和Spring Data 1.5进行整合,实现了DAO层的封装。下面将详细解释这些关键知识点。 1. MongoDB MongoDB是一个流行的开源文档型数据库,它采用了NoSQL的数据模型,以JSON...
DAO模式通常结合工厂模式或接口实现,例如使用DAO接口定义操作规范,然后通过具体实现类完成具体的数据库操作。这种设计允许灵活地切换不同的数据存储技术,如MySQL、Oracle或NoSQL数据库。 3. SQL与动态SQL - ...
在本项目中,"省略DAO层,采用全注解完成登录功能"是一个创新的实践,旨在简化传统的Java Web开发中的数据访问层(DAO层)结构。DAO层通常用于处理数据库交互,但在本示例中,我们将看到如何利用Java的注解技术来减少...
这个项目的核心是利用Spring作为应用的ioc(Inversion of Control,控制反转)和aop(Aspect Oriented Programming,面向切面编程)容器,MyBatis作为持久层框架,以及JUnit4用于进行单元测试和集成测试。...
创建一个DAO接口,定义所有需要的方法,然后创建一个实现该接口的类,如`UserDaoImpl`,在这个实现类中使用Hibernate API完成实际的数据库操作。 5. **泛型DAO**: 为了进一步提高代码的复用性,可以使用泛型来...