Spring学习总结(四)——Spring单元测试和JDBCTemplate的简单使用

  Spring单元测试

    使用spring中对Junit框架的整合功能, 除了junit4和spring的jar包,还需要spring-test.jar。

 示例:

 Spring学习总结(四)——Spring单元测试和JDBCTemplate的简单使用_第1张图片

beans.xml



	
	
	
	
	

	
	
		
		
		
			
		
		
	

	
	
		
	

    
    
        
    

   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事务管理器,如:


    
        
    

@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 不会导致事务回滚的异常类名字数组

测试结果:

Spring学习总结(四)——Spring单元测试和JDBCTemplate的简单使用_第2张图片

Spring学习总结(四)——Spring单元测试和JDBCTemplate的简单使用_第3张图片

JDBCTemplate的简单使用示例

 1.需要在Spring的配置文件中进行相关配置,如:


	
	
	
	

	
	
		
		
		
			
		
		
	

	
	
		
	

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() {
			@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;
		
	}
}

 

  

你可能感兴趣的:(Spring)