myBatis 从 spring分离 进行快速单元测试
项目采用mybatis + spring开发,这是以前的测试代码, 【运行需要30s】
private static MemberService memberService;@BeforeClasspublic static void setUp() throws Exception{ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");memberService = (MemberService)context.getBean("memberService");?
?这种方式的不好,要实例化整个spring容器,如果项目很大,一个单元测试运行的时间将会很长;
?下面我把myBatis从spring进行分离,分离后进行单元测试速度很快:下面是改进后的测试类,【运行只需3s】
?
private static MemberService memberService;@BeforeClasspublic static void setUp() throws Exception{MemberDao memberDao = new MemberDao();memberDao.setMemberMapper((MemberMapper)SessionFactory.getMapper(MemberMapper.class));MemberServiceImpl memberServiceimpl = new MemberServiceImpl();memberServiceimpl.setMemberDao(memberDao);memberService = memberServiceimpl;1,configuration 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> <settings> <!-- changes from the defaults --> <setting name="lazyLoadingEnabled" value="false" /> </settings> <typeAliases> <!-- 会员实体begin --> <typeAlias alias="member" type="com.***.project.member.domain.Member" /> <!-- 会员实体end --> </typeAliases> <plugins> <!-- 指定数据库分页方言Dialect, 其它方言:OracleDialect,SQLServerDialect,SybaseDialect,DB2Dialect,PostgreSQLDialect,MySQLDialect,DerbyDialect--> <plugin interceptor="com.***.project.common.mybatis.interceptor.OffsetLimitInterceptor"> <property name="dialectClass" value="com.***.project.common.mybatis.dialect.OracleDialect"/> </plugin> </plugins><environments default="develop"><environment id="develop"><transactionManager type="com.***.project.utils.TransactionManager"></transactionManager><dataSource type="POOLED" ><property name="driver" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@****:***" /><property name="username" value="***" /><property name="password" value="***" /></dataSource></environment></environments><mappers><mapper resource="mappers/MemberMapper.xml"/></mappers></configuration>
2,?TransactionManager类 自定义事务管理,主要是用作自动提交,autoCommit
?
public class TransactionManager implements TransactionFactory {@Overridepublic Transaction newTransaction(Connection conn, boolean autoCommit) {Transaction tx = new JdbcTransaction(conn, true);return tx;}@Overridepublic void setProperties(Properties arg0) {}}?3,下面是我的核心类 ,主要是获取sqlSession与Mapper接口
?
public class SessionFactory {private static SqlSessionFactory sessionFactory;private SessionFactory(){}static{String resource = "com/***/project/utils/mybatis.xml";Reader reader;try {reader = Resources.getResourceAsReader(resource);sessionFactory = new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession(){return sessionFactory.openSession();}public static Object getMapper(Class cls){return MapperProxy.newMapperProxy(cls, getSqlSession());}}小结:把dao层分离可以进行快速的单元测试(严格来说是集成测试),但如果自动化运行所有的测试,也可以直接从spring容器中获取service进行测试,可参昭我的文章http://mingliang-luo.iteye.com/blog/1237351