八、编写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 集成之三
分享到:
相关推荐
Spring还提供了对Web应用的支持,如Spring MVC,与Struts集成时可提供更灵活的控制层实现。 **Struts框架**: Struts 2.1.6是基于Model-View-Controller(MVC)设计模式的Java Web框架。它提供了一种结构化的方式来...
本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...
这个“spring3 ibatis struts2 搭建的简单项目”就是一个利用这三个框架进行集成开发的例子,主要目的是为了教学和学习。 首先,Spring框架是企业级应用开发的基石,它提供了全面的编程和配置模型,用于简化Java...
Spring、Struts2和iBatis是Java Web开发中的三个重要框架,它们分别负责不同的职责。Spring是一个全面的后端应用程序框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能;Struts2则是一个MVC(模型-视图-控制器...
这个“struts2+spring+iBatis框架包”集成了这三个框架,使得开发者能够快速构建基于MVC(Model-View-Controller)模式的Web应用。 Struts2作为MVC框架,负责处理应用程序的控制逻辑。它通过Action类和配置文件定义...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
Struts2、Spring和iBatis是Java Web开发中三个非常重要的开源框架,它们的集成应用,即SSI2(Struts2 + Spring + iBatis)整合,是构建企业级应用的常见方式。这个"struts2+spring+ibatis做的增删改查的小例子"是一...
加快了开发速度,但是也有一些不足之处,比如由于三种框架的配置文件较多,也给我们带来了一些不便,特别是对于较小的应用来说更是如此,本文主要是对Strtus2、Spring、iBatis三个开源框架进行一个集成
Struts2、Spring和iBatis是Java Web开发中常用的三个框架,它们分别负责MVC模式中的Action层、业务逻辑层以及数据访问层。将这三个框架整合在一起,可以构建出高效、灵活的企业级应用。 **Struts2** 是一个基于MVC...
Spring+Struts2+iBatis是一个经典的Java轻量级开发框架组合,主要用于构建Web应用程序。这三个框架协同工作,提供了一种高效、灵活的解决方案,帮助开发者实现MVC(Model-View-Controller)架构。 首先,Spring框架...
"ibatis+spring+struts2 整合开发例子"就是一个典型的Java Web应用集成开发案例,旨在帮助开发者理解和掌握这三大框架的协同工作原理。接下来,我们将详细讨论这三个组件以及它们的整合过程。 Ibatis是一个轻量级的...
在Struts2+Spring整合中,Spring主要负责业务对象的管理、事务控制和与iBatis的集成。通过Spring的IoC容器,可以方便地管理Action类的实例,实现Bean的自动装配。 3. **iBatis框架**:iBatis是一个持久层框架,它...
在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何相互配合,实现项目的集成。 Struts2作为MVC(Model-View-Controller)架构的实现,主要负责处理用户请求,控制应用的流程。它提供...
Struts1.2、Spring2和iBatis是经典的Java Web开发框架,它们的集成可以构建出高效、灵活的企业级应用程序。在这个项目实战源码中,我们可以深入学习这三大框架如何协同工作,以及如何在实际开发中应用它们。 首先,...
在Spring中,Struts2和iBatis可以通过Spring的Bean管理来实现无缝集成。 **Struts2 框架** Struts2 是Struts1的下一代产品,基于MVC设计模式,提供了一种更灵活的请求处理方式。它通过拦截器链来处理请求,可以...
通过这个项目,开发者可以深入理解Struts2、Spring、iBatis以及MySQL的集成方式,了解它们如何协同工作以完成Web应用的基本功能。在实际开发中,这种架构提供了良好的分层和模块化,有利于项目的扩展和维护。
这个架构结合了Spring框架、Struts2框架和iBatis(现在称为MyBatis)来构建高效且可维护的Web应用。下面将详细阐述这三个框架以及它们在整合中的作用。 1. Spring框架:Spring是Java企业级应用的核心框架,它提供了...
Struts2、Spring和iBatis是Java Web开发中非常重要的三个框架,它们分别负责MVC模式中的Action层、业务逻辑层以及数据访问层。这三个框架的整合可以提供一个高效且灵活的开发环境,帮助开发者构建出结构清晰、易于...
本实例关注的是“ibatis+Spring+struts2”的整合,这是一个经典的Java Web开发组合,用于实现数据访问、业务逻辑控制和用户界面交互。下面我们将深入探讨这三个组件及其整合的关键知识点。 1. **iBATIS**:iBATIS...
这样,一个完整的请求流程就形成了:用户请求->Struts2处理->Spring调用Service->Ibatis执行SQL->结果返回给Struts2->展示给用户。 在BRKR这个压缩包文件中,可能包含了这些组件的配置文件、源代码、JSP页面等资源...