`
shenxiaolei
  • 浏览: 13273 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Spring IBatis Struts2 集成之二

阅读更多

接上文Spring IBatis Struts2集成之一

八、编写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 Struts2 集成之一:Spring与IBatis集成 | Spring IBatis Struts2 Integration I: Spring Integrates with IBatis - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来

 

至此,完成Spring与IBatis的集成。

 

附录I:项目结构及完整配置 | Appendix I: Project structure and complete configuration

1、项目结构如下图所示:

Spring IBatis Struts2 集成之一:Spring与IBatis集成 | Spring IBatis Struts2 Integration I: Spring Integrates with IBatis - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来

 
 
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 集成之三

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics