版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40348465/article/details/85009193
Spring单元测试
使用spring中对Junit框架的整合功能, 除了junit4和spring的jar包,还需要spring-test.jar。
示例:
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- Spring容器自动装配bean,搜索的的路径配置 -->
<context:component-scan base-package="com.springstudy" />
<!-- 属性占位符加载器 加载配置文件jdbc.properties -->
<context:property-placeholder location="jdbc.properties" />
<!-- 使用Spring-jdbc包自带的 进行实例化数据源DriverManagerDataSource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次 -->
<property name="acquireRetryAttempts" value="3" />
</bean>
<!-- spring jdbc模板数据源设定 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Spring JDBC 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springstudy?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=
EmpTest.java(单元测试)
package com.springstudy.test;
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import com.springstudy.pojo.Employee;
import com.springstudy.service.IEmployeeService;
/*@RunWith 注释标签是 Junit 提供的,用来说明此测试类的运行者,这里用了 SpringJUnit4ClassRunner,
这个类是一个针对 Junit 运行环境的自定义扩展,用来标准化在 Spring 环境中 Junit4.5 的测试用例,例如支持的注释标签的标准化*/
@RunWith(SpringJUnit4ClassRunner.class)
/*@ContextConfiguration 注释标签是 Spring test context 提供的,
用来指定 Spring 配置信息的来源,支持指定 XML 文件位置或者 Spring 配置类名。*/
@ContextConfiguration(locations = {"classpath:beans.xml"})
/*@Transactional 注释标签是表明此测试类的事务启用,这样所有的测试方案都会自动的 rollback,
即不用自己清除之前对数据库的变更了,使用@Transactional需先在xml文件中配置jdbc事务管理器*/
@Transactional
public class EmpTest {
@Resource(name="empService")
private IEmployeeService empService;
@Test
public void testFindEmployeeByNo() {
String empno = "1001";
Employee emp = empService.findEmployeeByNo(empno);
System.out.println(emp);
}
@Test
public void testUpdateEmployee() {
Employee emp = new Employee();
emp.setEmpNo("1001");
emp.setEmpName("赵六");
int effectLine = empService.updateEmployee(emp);
// 使用断言
// assertEquals 如果预期值与真实值相等,则运行success,反之Failure
Assert.assertEquals(1, effectLine);
}
}
@RunWith: 该注解是Junit 提供的,用来说明此测试类的运行者,这里用了 SpringJUnit4ClassRunner,
这个类是一个针对 Junit 运行环境的自定义扩展,用来标准化在 Spring 环境中 Junit4.5 的测试用例,例如支持的注释标签的标准化。
@ContextConfiguration :该注解是Spring test context 提供的,用来指定 Spring 配置信息的来源,支持指定 XML 文件位置或者 Spring 配置类名,如上面的代码所示,当在一个类中使用该注解时,该类中其实已经引用了Application,从而无需再声明ApplicationContext。
@Transactional :该注解是表明此测试类的事务启用,这样所有的测试方案都会自动的 rollback,即不用自己清除之前对数据库的变更了,使用@Transactional需先在xml文件中配置jdbc事务管理器,如:
<!-- Spring JDBC 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
@Transactional的属性:
属性 | 类型 | 描述 |
---|---|---|
value | String | 可选的限定描述符,指定使用的事务管理器 |
propagation | enum: Propagation | 可选的事务传播行为设置 |
isolation | enum: Isolation | 可选的事务隔离级别设置 |
readOnly | boolean | 读写或只读事务,默认读写 |
timeout | int (in seconds granularity) | 事务超时时间设置 |
rollbackFor | Class对象数组,必须继承自Throwable | 导致事务回滚的异常类数组 |
rollbackForClassName | 类名数组,必须继承自Throwable | 导致事务回滚的异常类名字数组 |
noRollbackFor | Class对象数组,必须继承自Throwable | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 类名数组,必须继承自Throwable | 不会导致事务回滚的异常类名字数组 |
测试结果:
JDBCTemplate的简单使用示例:
1.需要在Spring的配置文件中进行相关配置,如:
<!-- Spring容器自动装配bean,搜索的的路径配置 -->
<context:component-scan base-package="com.springstudy" />
<!-- 属性占位符加载器 加载配置文件jdbc.properties -->
<context:property-placeholder location="jdbc.properties" />
<!-- 使用Spring-jdbc包自带的 进行实例化数据源DriverManagerDataSource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次 -->
<property name="acquireRetryAttempts" value="3" />
</bean>
<!-- spring jdbc模板数据源设定 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.使用示例:
package com.springstudy.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.springstudy.pojo.Employee;
@Repository("empDao")
public class EmployeeDaoImpl implements IEmployeeDao{
private JdbcTemplate jdbcTemplate;
@Resource
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public Employee findEmployeeByNo(String empno) {
String sql = "select empNo,empName from emp where empNo=?";
Object[] argus = {empno};
Employee result = jdbcTemplate.queryForObject(sql, argus, new RowMapper<Employee>() {
@Override
public Employee mapRow(ResultSet rs, int arg1) throws SQLException {
Employee emp=new Employee();
emp.setEmpNo(rs.getString("empNo"));
emp.setEmpName(rs.getString("empName"));
return emp;
}
});
return result;
}
public int updateEmployee(Employee emp) {
String sql = "update emp set empName=? where empNo=?";
Object[] args = {emp.getEmpName(),emp.getEmpNo()};
int effectLine = jdbcTemplate.update(sql,args);
return effectLine;
}
}