单元测试 - 集成H2 Dao测测试

news2024/9/23 5:22:33

SpringBoot 2.7、Mybatis plus、H2

1. pom引入h2

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
</dependency>

2. 配置h2数据源 & mapper路径

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:ut_test;DB_CLOSE_DELAY=-1;MODE=MySQL
    username:
    password:
  sql:
    init:
      schema-locations:
        - classpath:schema.sql
      data-locations:
        - classpath:data.sql


mybatis-plus:
  mapper-locations: classpath*:mapper/*Mapper.xml
  global-config:
    db-config:
      logic-delete-field: IsDeleted
      logic-delete-value: 1
      logic-not-delete-value: 0

3. 准备单测环境

import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class) //启动SpringRunner运行单测
@SpringBootTest(classes = { // 指定需要加载到Spring容器中的类
        DataSourceAutoConfiguration.class, // 数据源自动装配类,装配数据源DataSource
        MybatisPlusAutoConfiguration.class, // mybatisPlus自动装配类,SqlSession相关Bean
        SqlInitializationAutoConfiguration.class,// sql初始化自动装配类,以运行sql初始化文件(eg. schema.sql)
        RepoTestConfig.class // 自定义配置类,指定mapper扫描路径
})
public class BaseTest {

}



import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({"com.xx.mapper"}) // 指定mapper类扫描位置
public class RepoTestConfig {
}


// 具体测试类
public class MapperTest extends BaseTest {
    @Autowired
    TestgMapper testgMapper ;

    @Test
    public void selectByKey() {
        testgMapper .selectByKey("");
    }
}

4. Sql init

   schema.sql

CREATE TABLE `xx` (
  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
  `K` varchar(255) NOT NULL COMMENT 'key',
  `V` text COMMENT 'value',
  `Remark` varchar(255) DEFAULT NULL,
  `CreatedBy` int(11) DEFAULT '0' COMMENT '0-system',
  `CreatedDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `UpdatedBy` int(11) DEFAULT '0' COMMENT '0-system',
  `UpdatedDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `IsDeleted` bit(1) DEFAULT '0',
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Idx_K` (`K`)
);

   data.sql (看需求)

insert into ...

5. 考虑点&遇到的问题

        5.1 Spring容器需要加载哪些类,如何加载

        方式一,通过@SpringBootApplication启动容器&加载Bean

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = {"com.xx.mapper"})
public class UTApplication {
    public static void main(String[] args) {
            SpringApplication.run(UTApplication.class, args);
    }
}

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = UTApplication.class)
public class BaseTest {

}

pros:简单,几个注解简单配置搞定,不用去关心具体需要配置的Bean(因为所有用到的用不到的都被引入了)

cons:@SpringBootApplication注解会开启自动装配,一些非必要的类也会被装配到单测的Spring环境中

        方式二 按需装配 

@RunWith(SpringRunner.class) //启动SpringRunner运行单测
@SpringBootTest(classes = { // 指定需要加载到Spring容器中的类
        DataSourceAutoConfiguration.class, // 数据源自动装配类,装配数据源DataSource
        MybatisPlusAutoConfiguration.class, // mybatisPlus自动装配类,SqlSession相关Bean
        SqlInitializationAutoConfiguration.class,// sql初始化自动装配类,以运行sql初始化文件(eg. schema.sql)
        RepoTestConfig.class // 自定义配置类,指定mapper扫描路径
})
public class BaseTest {

}

        pros:按需加载,用到哪些加载哪些

        cons:需要花些时间确定需要加载的Bean,最后确定如上图        

        5.2 问题&解决        

        按照spring.datasource.schema: schema.sql的方式配置sql初始化脚本,以@SpringBootApplication方式启动容器没问题,改成按需装配后初始化脚本schema.sql 未执行

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:ut_test;DB_CLOSE_DELAY=-1;MODE=MySQL
    username:
    password:
    schema : schema.sql // 一开始错误的配置方式

  sql:
    init:
      schema-locations:
        - classpath:schema.sql // 修正后正确的配置方式

排查一番后发现,原因是按需加载方式未将负责初始化sql的sql Initializer加载到容器中,所以就做不了这事,经过排查,此类是SqlInitializationAutoConfiguration,将其指定加载到容器中即可。

而@SpringBootApplication方式默认是装配了该类的,所以可行。

并且在排查过程中发现,sql Initializer默认会去找spring.sql.init下指定的sql文件,如果找不到,再去加载了classpath下的schema.sql。所以之前schema: schema.sql指定的sql文件能被正确加载,是因为他被命名为schemal.sql并且被放在了classpath下,并不是因为schema: schema.sql的配置,换个名就不行了。也就是说不需要配置schema: schema.sql, 直接在resource下放一个名叫schema.sql的文件,都能正常工作。正确的方式是通过spring.sql.init方式指定

排查过程

通过查看配置文件中schema-locations的引用位置,定位到SqlInitializationProperties

 通过对SqlInitializationProperties的引用加上合理猜测定位SettingsCreator

 根据引用定位SqlDataSourceScriptDatabaseInitializer

 再看是谁负责加载SqlDataSourceScriptDatabaseInitializer. nice,that's DataSourceInitializationConfiguration,也就是说只要把DataSourceInitializationConfiguration加载进容器,就可以了。但是,发现这个类是包私有的,外部不能引用,好吧,那就再网上找一级,谁来负责加载DataSourceInitializationConfiguration

SqlInitializationAutoConfiguration,就是他,配置到容器即可

 

@SpringBootTest(classes = {SqlInitializationAutoConfiguration.class})

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

( 位运算 ) 260. 只出现一次的数字 III ——【Leetcode每日一题】

❓260. 只出现一次的数字 III 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额…

精炼计算机网络——数据链路层(一)

文章目录 前言3.1 数据链路和帧3.1.1 数据链路和帧3.1.2 三个基本问题 总结 前言 上篇文章&#xff0c;我们一同学完了物理层的全部内容&#xff0c;在本篇文章中&#xff0c;我们初步学习数据链路层&#xff0c;理解数据链路和帧的相应概念&#xff0c;知晓封装成帧&#xff…

信号完整性分析基础知识之传输线和反射(五):较短阻抗不连续的传输线、残桩和末端容性负载引起的反射

首先来一首定场诗&#xff1a;难难难&#xff0c;道德玄&#xff0c;不对知音不可谈。对了知音谈几句&#xff0c;不对知音枉费舌尖。 较短不连续点引起的反射 很多时候&#xff0c;板载走线的宽度必须要收窄&#xff0c;特别是经过PF区域或者拥挤区域。如果传输线的某一小段…

eSIM证书要求-证书验证-EID

SM-DP 和 SM-DS 应该验证 EUM 和 eUICC 证书中限制的 IIN 和 EID 的一致性&#xff08;参见第 4.5.2.1.0.2 和 4.5.2.1.0.3 节&#xff09;&#xff0c;并考虑 SGP.29 [ 89]。 根据 SGP.29 [89] 颁发的 EID 没有 SGP.02 [2] 中定义的 8 位 IIN。 相反&#xff0c;它们具有可变长…

【计算机视觉 | Python】十个 Python 图像处理工具,建议点赞收藏

文章目录 一、前言二、常见的库2.1 scikit-image2.2 NumPy2.3 SciPy2.4 PIL / Pillow2.5 OpenCV-Python2.6 SimpleCV2.7 Mahotas2.8 SimpleITK2.9 pgmagick2.10 Pycairo 一、前言 这些 Python 库提供了一种简单直观的方法来转换图像并理解底层数据。 今天的世界充满了数据&am…

linux【网络编程】之UDP网络程序模拟实现

linux【网络编程】之UDP网络程序模拟实现 一、开发环境二、服务端实现2.1 接口认识2.1.1 socket创建网络通信套接字2.1.2 bind&#xff1a;绑定Ip和端口号2.1.3 sockaddr_in结构体2.1.4 IP地址转换函数&#xff1a;inet_addr、inet_ntoa2.1.5 recvfrom&#xff1a;读取数据 2.2…

大语言模型进化树重磅发布,感慨技术方向选择的残酷,文末有彩蛋

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天说点有深度的内容。五一假期&#xff0c;学习了一篇论文《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》。 这篇论文来自 Amazon 以及 Texas A&M University 研究团队&…

【2023 · CANN训练营第一季】应用开发深入讲解——第五章 端到端案例讲解

学习资源 样例介绍 使用DVPP加速预处理网络输入&#xff0c;并通过模型转换使能静态AIPP功能&#xff0c;使能AIPP功能后&#xff0c;YUV420SP_U8格式图片转化为RGB&#xff0c;然后减均值和归一化操作&#xff0c;并将该信息固化到转换后的离线模型中&#xff0c;对ResNet50…

传统IDC服务器迁移上云流程

上云是趋势&#xff0c;越来越多企业的IDC服务器选择迁移上云&#xff0c;迁移上云的方式有很多&#xff0c;阿里云提供服务器迁移中心SMC来帮助用户迁移上云。使用SMC服务器迁移中心&#xff0c;将您的源服务器方便快捷地迁移至阿里云&#xff0c;支持的迁移源类型包括IDC服务…

【Java EE 初阶】锁策略以及CAS问题

目录 1.常见的锁策略 1.乐观锁 vs 悲观锁 2.读写锁 3.重量级锁 vs 轻量级锁 4.自旋锁&#xff08;Spin Lock&#xff09; 5.公平锁 vs 非公平锁 6.可重入锁 vs 不可重入锁 7.Synchronized实现了哪些锁策略&#xff1f; 1.是乐观锁也是悲观锁 2.既是轻量级锁也是重量级…

K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示

K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明IIC时序对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RCADS1115 ADC模块1.2、STM32F103C8T6ADS1115 ADC模块 五、基础知识学习…

解决“未在本地计算机注册“OraOLEDB.Oracle.1”提供程序“问题

由于本地使用Oracle.ManagedDataAccess批量插入问题&#xff0c;连接数据库时报错 : ProviderOraOLEDB.Oracle;Data Sourceorcl;User IdQueueDp;PasswordQueueDp 此问题之前解决过没记录&#xff0c;又遇到了&#xff0c;忘了怎么解决&#xff0c;试了很多没效果 解决办法一、…

用好git stash,工作超nice

一、介绍 如果修改后的内容还不想commit&#xff0c;就可以用git stash命令。它会将工作区和暂存区中的修改(也就是还没commit的内容)都会被保存到堆栈里&#xff0c;并在之后恢复到任意指定的分支上。 二、应用场景 1、在分支a进行开发feature 1时&#xff0c;突然需要紧急…

2、Orangepi Zero2刷机和系统启动

目录 2.1 工具安装 2.2 刷机 2.3 登录系统 2.4 修改登陆密码 2.5 网络配置 2.6 SSH登陆开发板 就像买了电脑&#xff0c;出厂带有 windows 操作系统&#xff0c;才算是正在的电脑&#xff0c;开发板需要烧写对应的系统固件&#xff0c;才 能正常发挥作用 工具 Orangepi Zero2…

【异常解决】浏览器无法访问此网站ERR_UNSAFE_PORT/网页可能无法连接,或者它已永久性地移动到了新网址问题解决方案

浏览器无法访问此网站ERR_UNSAFE_PORT问题解决方案 一、问题描述二、问题原因三、解决方案3.1 方案1修改服务器访问端口号&#xff08;推荐&#xff09;3.2 方案2修改浏览器设置3.2.1 Chrome浏览器3.2.2 Firefox浏览器3.2.3 Edge浏览器 一、问题描述 访问某一个特定的网址之后…

Flume系列:Flume Channel使用

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;Kafka Channel 2&#xff1a;File Channel 3&#xff1a;Memory Channel Apache Hadoop生态-目录汇总-持续更新 系统环境&#xff1a;centos7 Java环境&#xff1a;Java8 1&#xff1a;Kafka Channel Kafka Chan…

vim键位图+vim基本操作命令表

前言&#xff1a;本章末vim的基本操作命令总结的比较全&#xff0c;建议收藏起来&#xff0c;方便后面使用时作字典查找。 目录 一、什么是vi(vim)&#xff1f; vim键盘 二、vim工作模式 1&#xff09;命令模式 2&#xff09;编辑模式 3&#xff09;末行模式 4&#xf…

「2024」预备研究生mem-等差数列基础

一、等差数列基础 二、课后练习题 思路&#xff0c;知道a1和d &#xff0c;就可以知道an,sn

Kafka 集成 SpringBoot, 快速入门

一、kafka的生产者和消费者 1. 生产者发送消息的流程 2. 消费者接收消息的流程 二、 java 代码实现 1. 添加依赖&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.12</artifactId></dependency>2. 实现…