八、编写JUnit单元测试 | Write junit testcase class
1、编写JUnit公用类:DaoBaseTestCase.java,其内容如下:
/** * 建立时间:2011-3-19 */ package cn.aofeng.sis.dao;
import java.util.Date;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import cn.aofeng.sis.domain.UserStatus; import cn.aofeng.sis.domain.UserType;
/** * DAO单元测试公用类. * * @author 傲风 <a href="mailto:aofengblog@163.com">aofengblog@163.com</a> */ public class DaoBaseTestCase extends AbstractTransactionalJUnit4SpringContextTests {
/** * Default constructor. */ public DaoBaseTestCase() { }
/** * 向数据库插入一条账号记录. * * @param userId 账号ID. * @return 插入记录成功返回1;插入记录失败返回0. */ public int insertUser(Long userId) { final String sql = "insert into USER(USER_ID, USER_TYPE, USER_STATUS, USER_NAME, USER_PASSWD, CREATE_TIME, UPDATE_TIME) values(?, ?, ?, ?, ?, ?, ?)"; int result = simpleJdbcTemplate.update(sql, userId, UserType.OPERATOR, UserStatus.NORMAL, "aofeng"+userId, "aofeng", new Date(), new Date()); return result; } /** * 删除指定账号ID的账号记录. * * @param userId 账号ID. * @return 删除记录成功返回1;删除记录失败返回0. */ public int deleteUserByUserId(Long userId) { final String sql = "delete from USER where USER_ID = ?"; int result = simpleJdbcTemplate.update(sql, userId); return result; }
} |
2、编写UserDAOImpl的单元测试类:UserDaoImplTest,其内容如下:
/** * 建立时间:2011-3-19 */ package cn.aofeng.sis.dao;
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.test.context.ContextConfiguration;
import cn.aofeng.sis.domain.User;
/** * {@link cn.aofemg.sis.dao.UserDAOImpl}的单元测试代码. * * @author 傲风 <a href="mailto:aofengblog@163.com">aofengblog@163.com</a> */ @ContextConfiguration(locations={"/ApplicationContext.xml"}, inheritLocations=false) public class UserDAOImplTest extends DaoBaseTestCase {
protected Long _userId = 1L; @Resource(name="userDAO") protected UserDAO _userDAO; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { int result = super.insertUser(_userId); assertEquals(1, result); } /** * @throws java.lang.Exception */ @After public void tearDown() throws Exception { @SuppressWarnings("unused") int result = super.deleteUserByUserId(_userId); } /** * Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#deleteByUserId(java.lang.Long)}. */ @Test public void testDeleteByUserIdForExist() { // 测试删除已经存在的记录. int result = _userDAO.deleteByUserId(_userId); assertEquals(1, result); } /** * Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#deleteByUserId(java.lang.Long)}. */ @Test public void testDeleteByUserIdForNotExist() { // 测试删除不存在的记录. int result = _userDAO.deleteByUserId(100L); assertEquals(0, result); }
/** * Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserId(java.lang.Long)}. */ @Test public void testSelectByUserIdForExist() { // 测试查询已经存在的记录 User record = _userDAO.selectByUserId(_userId); assertNotNull(record); assertEquals(1, record.getUserId().longValue()); assertEquals("aofeng"+_userId, record.getUserName()); } /** * Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserId(java.lang.Long)}. */ @Test public void testSelectByUserIdForNotExist() { // 测试查询不存在的记录 User record = _userDAO.selectByUserId(100L); assertNull(record); }
/** * Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserName(java.lang.String)}. */ @Test public void testSelectByUserNameForExist() { // 测试查询用户名存在的记录 User record = _userDAO.selectByUserName("aofeng"+_userId); assertNotNull(record); assertEquals(1, record.getUserId().longValue()); assertEquals("aofeng"+_userId, record.getUserName()); } /** * Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserName(java.lang.String)}. */ @Test public void testSelectByUserNameForNotExist() { // 测试查询用户名不存在的记录 User record = _userDAO.selectByUserName("userNotExists"); assertNull(record); }
} |
3、运行单元测试,结果如下:
至此,完成Spring与IBatis的集成。
附录I:项目结构及完整配置 | Appendix I: Project structure and complete configuration
1、项目结构如下图所示:
2、Spring 配置文件ApplicationContext.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"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<!-- 载入资源文件,下面的dataSource就引用了资源文件中的配置项 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<context:component-scan base-package="cn.aofeng.sis" />
<context:annotation-config />
<!-- 数据源配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxIdleTime" value="${maxIdleTime}"/>
<property name="maxPoolSize" value="${maxPoolSize}"/>
<property name="minPoolSize" value="${minPoolSize}"/>
<property name="initialPoolSize" value="${initialPoolSize}"/>
<property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>
</bean>
<!-- IBatis ORM 操作类 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
</bean>
<!-- Spring的IBatis模板 -->
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient"></property>
</bean>
<!-- 事务管理配置 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
3、IBatis 配置文件SqlMapConfig.xml的完整内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings cacheModelsEnabled="true" useStatementNamespaces="true"/>
<sqlMap resource ="cn/aofeng/sis/domain/USER_SqlMap.xml" />
</sqlMapConfig>
附录II:Spring配置项说明 | Appendix II: Spring configuration items description
1、<context:component-scan/>说明。
<context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。
2、<context:annotationconfig/>说明。
<context:annotationconfig/> 将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
3、<tx:annotation-driven /> 说明。
<tx:annotation-driven /> 表示使用声明式事务。如果用 'transactionManager' 来定义 PlatformTransactionManager bean的名字的话,你就可以忽略 <tx:annotation-driven/> 标签里的 'transaction-manager' 属性。 如果 PlatformTransactionManager bean你要通过其它名称来注入的话,你必须用 'transaction-manager' 属性来指定它。
见下文Spring IBatis Struts2 集成之三
分享到:
相关推荐
Spring2.5.5 struts2.1.6 ibatis2.3.4 Mysql5.1 利用IntelliJ IDEA(9) 集成 所有JAR包已经包含
加快了开发速度,但是也有一些不足之处,比如由于三种框架的配置文件较多,也给我们带来了一些不便,特别是对于较小的应用来说更是如此,本文主要是对Strtus2、Spring、iBatis三个开源框架进行一个集成
struts1.2 spring2 ibatis 集成项目实战源码
SSI(Struts2 + Spring + IBatis)框架集成。
ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成 ,一朵多 插入1万条数据,不到2秒,备注不包含类库
struts+spring+ibatis框架集成.pdf
此项目继承了Spring Struts2 Ibatis CXF,项目里面含有数据执行文件!具体请参见项目的readme.txt文件,里面详细描述需要对应框架支持需要的jar包。请注意,如果选取的版本不一致,所需要的jar可能不一样。
spring iBATIS struts1集成例子,详细源码
Struts1+Spring+iBatis集成-jar包,Struts1+Spring+iBatis集成
struts2 ibatis spring 集成开发
struts 2+spring +ibatis集成 ,
使用Spring集成struts2、ibatis、poi实现的增删改查功能,包括采用jquery实现的无刷新查询机分页、dwr实现的两级联动、以及采用poi动态将数据库数据导出成excel,本demo采用mysql数据库,附有建表sql,项目导入...
下载即用 下载就能跑 简单的test 供初学者学习
前言:本讲是在【第四讲:WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6+iBatis2.3.4】的基础上添加iBatis,此次集成其实质是Spring与Struts2的整合而已 目标:WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6+iBatis2.3.4+...
struts1+spring+hibernate+ibatis集成
*架构struts2_spring2.5_ibatis2.3 *mysql5.0 *jdk 1.6 *带有所有jar包,可直接运行 本实例实现了用户登陆,用户信息CRUD相关操作。让你感受到了ibatis做o/r mapping的方便快捷。 下次集成dwr进来 create ...
struts2+ibatis+spring集成的简单例子,eclipse3.3直接导入既可,那些包太大,所以我没放进来..
spring.struts,ibatis集成包,还有很多常用的包,这是我项目中用到的包,在这里备份一个,还有一部分在framework_lib2中
工具Myeclispe8.0 环境myelcipse tomcat6 所需jar包在.classpath文件中查看
一个整合的小例子,虽然说例子小,但涵盖的技术却不少,很适合初学者.. Spring,Struts2,ibatis,Sqlite,Ztree