mybatis是一款很不错的ORM框架,在项目中得到了很多应用。为了规范单元测试的习惯,特地基于Junit4为DAO层写了测试用例。基础测试从单表开始,数据表基本DDL为:
Create TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`userAge` int(11) DEFAULT NULL,
`userAddress` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
)
在实际写DAO层单元测试用例时,工程仅需要hamcrest-core,junit-4,mybatis,数据库驱动这四个jar包。创建基础Bean后,书写mybatis启动的核心配置文件config.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="User" type="com.model.User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/test" /> <property name="username" value="root"/> <property name="password" value="mysql"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/model/User.xml"/> </mappers> </configuration>
DAO接口及实现部分代码:
package com.dao;
import com.model.User;
public interface UserDao {
public User selectUserByID(int id);
public int deleteById(int id);
public int insertOne(User user);
public int updateOne(User user);
}
package com.dao.impl;
import org.apache.ibatis.session.SqlSession;
import com.base.SqlSessionBase;
import com.dao.UserDao;
import com.model.User;
public class UserDaoImpl extends SqlSessionBase implements UserDao{
private SqlSession session;
UserDao ud;
@Override
public User selectUserByID(int id) {
try{
session = SqlSessionBase.getSqlSession();
ud = session.getMapper(UserDao.class);
return ud.selectUserByID(id);
} finally{
session.close();
}
}
@Override
public int deleteById(int id) {
try{
session = SqlSessionBase.getSqlSession();
ud = session.getMapper(UserDao.class);
return ud.deleteById(id);
} finally{
session.commit();
session.close();
}
}
@Override
public int insertOne(User user) {
try{
session = SqlSessionBase.getSqlSession();
ud = session.getMapper(UserDao.class);
return ud.insertOne(user);
} finally{
session.commit();
session.close();
}
}
@Override
public int updateOne(User user) {
try{
session = SqlSessionBase.getSqlSession();
ud = session.getMapper(UserDao.class);
return ud.updateOne(user);
} finally{
session.commit();
session.close();
}
}
}
工具类:
package com.base;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionBase {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
public static SqlSession getSqlSession() {
try {
reader = Resources.getResourceAsReader("config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactory.openSession();
}
}
随后,使用Junit4书写单元测试用例:
package test;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.dao.impl.UserDaoImpl;
import com.model.User;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestUserDao {
private UserDaoImpl ud = new UserDaoImpl();
@Test
public void testSelectOne(){
Assert.assertEquals(ud.selectUserByID(1).getClass(), User.class);
}
@Test
public void testDeleteOne(){
Assert.assertEquals(ud.deleteById(2), 1);
}
@Test
public void testInsertone(){
User user= new User();
user.setId(2);
user.setUserAddress("Somewhere");
Assert.assertEquals(ud.insertOne(user), 1);
}
@Test
public void testUpdateOne(){
User user= new User();
user.setId(1);
user.setUserAddress("China xian");
user.setUserName("New name");
Assert.assertEquals(ud.updateOne(user), 1);
}
}
由于是对DAO层的测试,因此使用的断言较为简洁。Junit4提供的Assert API借用了hamcrest提供的断言语法AsserThat,在字符匹配、集合匹配等方面有了更直观的断言表达。在写单元测试用例中,正确使用断言语法尤为重要。