优雅单测-5基于Mybatis支持苞米豆单测

相关链接
优雅单测-1基于SpringBoot快速单测
优雅单测-2基于Spring快速单测,生成单测覆盖报告
优雅单测-3用Mockito轻松解决复杂的依赖问题
优雅单测-4如何优雅的做Mybatis单测
优雅单测-5基于Mybatis支持苞米豆单测
优雅单测-6基于Mybatis支持苞米豆单测-源码实现详解

1.苞米豆MyBatis-Plus介绍

MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变。核心功能为提供一套通用的CRUD框架,使用者只要专注拼接sql逻辑即可

单测之前假设:

  • 已顺利完成Mybatis的单测
  • 基于SpringBoot,但是希望单测执行快速稳定

2.Mybatis单测支持baomidou

使用baomidou框架做单测,区别于直接使用mybatis的是, 使用MybatisSqlSessionFactoryBean代替原生****SqlSessionFactoryBean即可

2.1 环境准备

引入依赖

<dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.3.2</version>
</dependency>

Mapper接口:

public interface BaseLiveReportMapper extends BaseMapper<LiveReportPO> {
}

Model:

@TableName("live_report")
public class LiveReportPO extends Model<LiveReportPO> {
}

2.2 开始基于Spring容器的单测

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = BaseLiveReportMapperTest.Config.class)
public class BaseLiveReportMapperTest {
    @Autowired
    private BaseLiveReportMapper baseLiveReportMapper;

    @Test
    public void getTest() {
        LiveReportPO liveReportPO = baseLiveReportMapper.selectById(1L);
        Assert.assertNotNull(liveReportPO);
    }
    
    @Configuration
    @Import(value = MybatisConfig.class)
    static class Config {
    }
}

2.3 增加数据源配置依赖


import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@MapperScan(basePackages = { "com.x.live.center.dao.mapper" }, 
            sqlSessionFactoryRef = "dataSessionFactory",
            sqlSessionTemplateRef = "dataSessionTemplate")
@PropertySource( "classpath:application-test.properties")
public class MybatisConfig {
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    
    @Bean(initMethod = "getConnection", destroyMethod = "close" ,name = "testDataSource")
    public DataSource dataSource() throws SQLException {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }  
    @Bean(name = "dataSessionFactory")
    public SqlSessionFactory sessionFactory(@Qualifier("testDataSource") DataSource dataSource) throws Exception {
        // SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        // 替换SqlSessionFactoryBean为苞米豆的MybatisSqlSessionFactoryBean
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.x.live.center.dao.mapper");
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/*Mapper.xml"));
        return sqlSessionFactoryBean.getObject();
    }
    @Bean(name = "dataSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory dataSessionFactory) {
        return new SqlSessionTemplate(dataSessionFactory);
    }
}

单测运行成功:

image.png

3. 配置详解

值得一提的是,如果不使用苞米豆提供的Spring环境session工厂(MybatisSqlSessionFactoryBean),执行就会提示没有对应的可执行sql:

image.png
image.png

那么可以思考一下baomidou是如何实现BaseMapper接口的,又为什么会报这个错的?

原理:

简单看一下源码,可以看到MybatisSqlSessionFactoryBean 和sqlSessionFactoryBean的实现基本是一样的, 只在方法 buildSqlSessionFactory() 中做了比较多修改。 其中主要在此处加在所有的Mapper,根据配置生成CRUD代码,注入 CURD 动态 SQL

所以说苞米豆框架并不完全基于Mybatis实现的,从SqlSessionFacotryBean开始,而是通过copy部分代码

111.png

4.最后

具体Mybatis中用到的配置做用处解释:

  • SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂bean
  • SqlSessionFactory是打开SqlSession会话的工厂接口,默认实现类DefaultSqlSessionFactory使用数据库连接池
  • SqlSession是客户端和数据库服务端之间的会话信息,里面有操作数据库的方法
  • SqlSessionTemplate是SqlSession的一个实现
  • DataSource方法:为Spring返回需要注册的数据源,这里使用HikariDataSource实现

下一章详细解一下苞米豆是如何实现的源码解析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341