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&
useUnicode=TRUE&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单元测试的主要内容,如果未能解决你的问题,请参考以下文章
maven工程web层的spring-mybatis配置文档
Spring-Mybatis --- 配置SqlSessionFactoryBean,整合Spring-Mybatis(转)