spring-mybatis整合的dao单元测试

Posted 星朵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring-mybatis整合的dao单元测试相关的知识,希望对你有一定的参考价值。

      在做spring-mybatis整合项目时对Dao所对应的 XXX.xml进行单元测试。整合时是spring和mybatis的整合,所以mybatis.xml文件就没有了,

对应的配置文件为spring-mybatis.xml文件,这是以spring配置文件的形式写的。下图是项目的结构,使用maven创建。

 

 

  spring-mybatis.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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-3.1.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 自动扫描service-->
    <context:component-scan base-package="cn.BBS.service" />

    <!-- 引入配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:config/db.properties" />
    </bean>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close">
        <!-- 指定连接数据库的驱动 -->
        <property name="driverClass" value="${jdbc.driver}"/>
        <!-- 指定连接数据库的URL -->
        <property name="jdbcUrl"
                  value="${jdbc.url}"/>
        <!-- 指定连接数据库的用户名 -->
        <property name="user" value="${jdbc.username}"/>
        <!-- 指定连接数据库的密码 -->
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--    自动扫描mapping.xml文件-->
        <property name="mapperLocations" value="classpath:cn/BBS/mapper/*.xml"></property>
    </bean>
    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.BBS.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
        </property>
    </bean>

</beans>

对应的db.properties文件如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bbsdb?characterEncoding=UTF-8&amp;
useUnicode=TRUE&amp;autoReconnect=true
jdbc.username=root
jdbc.password=123456

Dao类,该类是个接口类 : AdminMapper.java如下

 

package cn.BBS.dao;

import cn.BBS.po.Admin;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public interface AdminMapper {
    Admin selectAdmin(String ID);

    List<Admin> selectAllAdmin();

    int updateAdmin(Admin admin);

    int delectAdmin(int id);

    int updatePermissions(Map map);

    int updatePassword(Map map);

    int insertAdmin(Admin admin);
}

AdminMapper.xml代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.BBS.dao.AdminMapper" >
  <resultMap id="BaseResultMap" type="cn.BBS.po.Admin" >
    <id column="ID" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="realName" property="realname" jdbcType="VARCHAR" />
    <result column="Card" property="card" jdbcType="VARCHAR" />
    <result column="picture" property="picture" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="permissions" property="permissions" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Base_Column_List" >
    ID, name, realName, Card, picture, password, permissions
  </sql>

  <sql id="Base_Column_List_1" >
    ID, name, realName, Card, picture, permissions
  </sql>
  <select id="selectAdmin" resultMap="BaseResultMap" parameterType="String" >
    SELECT
    <include refid="Base_Column_List"></include>
    FROM admin
    WHERE ID=#{ID} OR name = #{ID}
  </select>

  <select id="selectAllAdmin" resultMap="BaseResultMap">
    SELECT
    <include refid="Base_Column_List_1"></include>
    FROM admin
  </select>

  <update id="updateAdmin" parameterType="cn.BBS.po.Admin">
    UPDATE admin
    SET
      name =#{name},
      realName = #{realname},
      picture = #{picture},
      password = #{password},
      permissions = #{permissions}
    WHERE ID= #{id}
  </update>

  <update id="updatePermissions" parameterType="java.util.Map">
    UPDATE admin
    SET
      permissions = #{permissions}
    WHERE ID= #{id}
  </update>


  <update id="updatePassword" parameterType="java.util.Map">
    UPDATE admin
    SET
    password = #{password}
    WHERE ID= #{id}
  </update>

  <delete id="delectAdmin" parameterType="Integer">
    delete from admin
    where ID = #{id,jdbcType=INTEGER}
  </delete>


  <insert id="insertAdmin" parameterType="cn.BBS.po.Admin">
    insert into admin (ID, name, realName, Card, picture, password, permissions)
    values (#{id},#{name},#{realname},#{card},#{picture},#{password},#{permissions})
    <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
      SELECT LAST_INSERT_ID() AS ID
    </selectKey>
  </insert>

</mapper>

由于该项目使用mybatis对应的XXX.xml文件如AdminMapper.xml来对实现Dao的CRUD等操作。所以需要对该xml文件进行测试。DAO接口类不用测试。

下面是测试类AdminMapperXmlDaoTest:

/**
 * 
 */
package cn.BBS.Mapperdao.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.annotation.Transactional;

import cn.BBS.dao.AdminMapper;
import cn.BBS.po.Admin;

/**
 * 作者:星朵 时间:Nov 10, 2017 类名:AdminMapperXmlDaoTest
 */
@ContextConfiguration(locations = { "/config/db.properties" })
public class AdminMapperXmlDaoTest {
    @Autowired
    private AdminMapper adminMapper;
    // private static String sourcePath = "/config/db.properties";
    private static String xmlePath = "/config/Spring/spring-mybatis.xml";

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    @Transactional
    public void updateAdminTest() {
        Admin admin = new Admin();
        admin.setId(112);
        admin.setName("sage");
        admin.setPassword("123456");
        admin.setPermissions(1);
        admin.setPicture("mypciture");

        admin.setRealname("星朵");
        admin.setCard("121153");
//下面解释我的疑惑。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlePath);
        adminMapper = applicationContext.getBean(AdminMapper.class);
        adminMapper.insertAdmin(admin);

    }

}
本来根据网上一般的做法,使用SqlSessionFactory来创建SqlSession来进行操作的。但是那些是基于mybatis.xml的,这个文件使用的文件格式根据其版本有两种:DOCTYPE和
scheme格式的。如果是前者,则使用SqlsessionFactory来创建Sqlsession;如果是后者则使用SqlsessionBean。由于我的项目的配置文件是spring-mybatis.xml的,与第一
中情况不一致,使用SqlsessionFactory创建Sqlsession会出错。
提示是:Cause: org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
所以我放弃了第一种做法,对于第二种做法我也尝试着去做,可能是本人的水平有限,结果也出错。无奈之下,就是用了上面代码那种做法,结果却意外的通过了。
结果如下:

 

无论网上的做法怎么样,我最后总结出来的测试步骤是:

(1)加载配置文件,这里的是spring-mybatis.xml文件;

(2)给bean实例化内容。

(3)从spring管理容器中获取bean,这里的bean已经有spring注入管理了;

(4)调取dao接口的方法验证对应的xml映射文件中的CRUD功能()。

  以上是我对于这种测试的一些感悟。当然由于水平有限,其中有不当解释也不足为奇。

 下面是参考的博文地址:https://www.cnblogs.com/fenglanglang/p/6007653.html

以上是关于spring-mybatis整合的dao单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Spring 与 MyBatis 整合

maven工程web层的spring-mybatis配置文档

Spring-Mybatis --- 配置SqlSessionFactoryBean,整合Spring-Mybatis(转)

mybatis3:Invalid bound statement (not found)

spring-mybatis整合

Spring-MyBatis整合