如何高效测试Mybatis?(xxxMapper)

目录

  • 一、背景
  • 二、对Dao层进行单元测试
    • 1 低效的方式
      • 1.1 使用@SpringBootTest:
      • 1.2 其他低效的方式
    • 2 高效的方式
      • 2.1 示例(报错:Failed to replace DataSource with an embedded database for tests)
      • 2.2 解决办法
        • 2.2.1 禁用自动配置的数据源替换

一、背景

  • 虽然我们可以借助插件来高效生成xxxDO、xxxMapper.java、xxxMapper.xml,但我们还需要对其进行修改。而在修改的过程中,我们可能会漏了逗号,或者类的字段类型与表的列类型不匹配,这都会导致增删改查失败。
  • 每次失败重新启动应用的话,会增加测试的时间开销。(JRebel热部署插件虽然能热部署xml文件,但有时候会失效。)
  • 因此,在进行controller-service-dao功能测试之前,我们要先对dao层进行单元测试。

二、对Dao层进行单元测试

1 低效的方式

1.1 使用@SpringBootTest:

@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid insert() {UserDO user = new UserDO();user.setName("John");user.setAge(30);userMapper.insert(user);assertNotNull(user.getId(), "Insert should generate ID");UserDO retrievedUser = userMapper.selectById(user.getId());assertNotNull(retrievedUser, "User should be retrieved after insertion");assertEquals("John", retrievedUser.getName(), "Name should match");assertEquals(30, retrievedUser.getAge(), "Age should match");}...
}
  • 低效的原因:使用@SpringBootTest会加载整个应用的上下文。

1.2 其他低效的方式

  • 把整个SpringBoot应用跑起来,通过Postman进行测试。
    • 企业级应用,要么本地起不来,要不跑一次要若干分钟。这么测试,又要加班了…

2 高效的方式

  • SpringBoot整合Mybatis引入了这个依赖:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.2</version>
</dependency>
  • 同理,也有对应的测试依赖:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.3.2</version>
</dependency>

官方文档

2.1 示例(报错:Failed to replace DataSource with an embedded database for tests)

@MybatisTest
class UserMapperSimpleTest {@Autowiredprivate UserMapper userMapper;@Testvoid deleteById() {UserDO user = new UserDO();user.setName("Alice");user.setAge(25);userMapper.insert(user);Integer userId = user.getId();assertNotNull(userId, "Insert should generate ID");userMapper.deleteById(userId);UserDO deletedUser = userMapper.selectById(userId);assertNull(deletedUser, "User should be deleted");}
}
  • 报错:Caused by: java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.
  • 原因:在测试中 Spring Boot 尝试替换数据源为一个内嵌的数据库,但是它找不到一个支持的内嵌数据库。

2.2 解决办法

  • 配置支持的内嵌数据库(很麻烦,又要建表,又要构造数据)
  • 禁用自动配置的数据源替换(很方便,一方面本地环境操作的是日常数据库,另一方面MyBatis 测试是事务性的,默认在每次测试结束时回滚)
2.2.1 禁用自动配置的数据源替换
@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserMapperSimpleTest {@Autowiredprivate UserMapper userMapper;@Testvoid insert() {UserDO user = new UserDO();user.setName("John");user.setAge(30);userMapper.insert(user);assertNotNull(user.getId(), "Insert should generate ID");UserDO retrievedUser = userMapper.selectById(user.getId());assertNotNull(retrievedUser, "User should be retrieved after insertion");assertEquals("John", retrievedUser.getName(), "Name should match");assertEquals(30, retrievedUser.getAge(), "Age should match");}@Testvoid deleteById() {UserDO user = new UserDO();user.setName("Alice");user.setAge(25);userMapper.insert(user);Integer userId = user.getId();assertNotNull(userId, "Insert should generate ID");userMapper.deleteById(userId);UserDO deletedUser = userMapper.selectById(userId);assertNull(deletedUser, "User should be deleted");}}
  • 我测试了下,@Service标注的类确实没法注入了。
@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserMapperSimpleTest {@Autowiredprivate UserMapper userMapper;@Autowired(required = false)private IUserService userService;@Testvoid testUserServiceNotInjected() {assertNull(userService, "User service should not be injected");}@Testvoid testUserMapperInjected() {assertNotNull(userMapper, "User mapper should be injected");}
}
  • 而如果是@SpringBootTest,就会把@Service标注的类也注入到容器中。

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

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

相关文章

蚁群算法实现 - 全局路径规划算法

参考博客&#xff1a; &#xff08;1&#xff09;【人工智能】蚁群算法(密恐勿入) &#xff08;2&#xff09;计算智能——蚁群算法 &#xff08;3&#xff09;蚁群算法(实例帮助理解) &#xff08;4&#xff09;【数之道 04】解决最优路径问题的妙招-蚁群ACO算法 &#xff08;…

uboot启动内核和根文件系统:通过dhcp设置bootcmd和bootargs来自动获取ip地址

uboot启动内核和根文件系统&#xff1a;通过dhcp设置bootcmd和bootargs来自动获取ip地址 一.问题描述&#xff1a; 首先我提前给ipaddr环境变量赋值为主机同一网段的任意一个ip&#xff08;就是根据自己的意愿随便挑了一个ip地址&#xff09;&#xff1a;192.168.0. 然后昨天…

Dubbo(一)

RPC框架 不仅具备RPC访问功能&#xff0c;还具备服务治理功能 2.5.3 2.7.3 Provider 提供者。编写持久层和事务代码 registry&#xff1a;Provider的ip 端口 协议 接口中的方法 consumer&#xff0c;service、controller monitor&#xff1a; dubbo支持的协议&#xff1a; Du…

深度学习中的温度参数(Temperature Parameter)是什么?

文章目录 Temperature Parameter1.背景知识2.引入Temperature Parameter3.Temperature是如何影响学习的&#xff1f; Temperature Parameter 1.背景知识 标准的深度学习模型具有一堆卷积、池化、全连接层&#xff0c;然后是最终的全连接层。最后的全连接层输出一个与类数大小…

2024-3-17Go语言入门

在Go语言中&#xff1a; var a chan int 定义了一个名为 a 的变量&#xff0c;其类型为 chan int。这意味着 a 是一个整型值的通道&#xff08;channel&#xff09;。通道是Go语言中用于goroutine之间通信的一种机制&#xff0c;你可以通过通道发送和接收特定类型的值。在这个例…

【计算机网络篇】物理层(2)传输方式

文章目录 &#x1f354;传输方式⭐串行传输和并行传输⭐同步传输和异步传输&#x1f388;同步传输&#x1f388;异步传输 ⭐单向通信&#xff0c;双向交替通信和双向同时通信 &#x1f354;传输方式 在物理层中&#xff0c;传输方式是指数据在传输介质中传输的方式和方法。常见…

RS编码性能测试

RS编码 基本知识 网上一大堆的介绍&#xff0c;这里不做复制和粘贴了。 这里针对RS编码在我的实际项目上的性能测试。 1、算法选择 RS&#xff08;255&#xff0c;239&#xff09;编码在255个符号中添加了16个纠错符号&#xff0c;这意味着它可以纠正多达8个错误符号&#xf…

基于单片机的灭火机器人设计

目 录 摘 要 I Abstract II 引 言 1 1 系统方案设计 4 1.1 方案论证 4 1.2 灭火机器人系统工作原理 4 2 系统硬件设计 6 2.1 单片机 6 2.2 火焰探测系统设计 8 2.3 灭火系统设计 8 2.4 循迹模块设计 9 2.5 电机驱动模块 10 3 系统软件设计 12 3.1 系统软件开发环境 12 3.2 系统…

前端应用开发实验:Vue的特性

目录 实验目的实验内容图片浏览功能代码实现效果 简单购物车功能代码实现效果 汇率换算功能代码实现效果 关于需要准备的内容&#xff0c;如Vue的下载就不多赘述了 实验目的 &#xff08;1&#xff09;掌握vue实例编写的语法和基本选项的使用 &#xff08;2&#xff09;在实际…

在odoo中, 定义内嵌视图和定义看板视图

在Odoo中&#xff0c;定义内嵌视图&#xff08;Embedded Views&#xff09;和看板视图&#xff08;Kanban Views&#xff09;是自定义模块和界面的常见需求。下面我将通过具体的代码示例来解释如何定义这两种视图&#xff0c;并提醒您注意一些重要的事项。 定义内嵌视图&#…

Leetcode--13

13. 罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

基于SpringBoot框架的校园二手交易系统的设计与实现(全套资料)

一、系统架构 前端&#xff1a;vue | element-plus 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk17 | mysql | maven | node | redis 二、代码及数据库 三、功能介绍 01. 后台管理-登录页 02. 后台管理-首页 03. 后台管理-基础模块-用户管理 04. 后…

67: 学生成绩管理(python)

收藏 难度&#xff1a;简单 标签&#xff1a;暂无标签 题目描述 有N个学生&#xff0c;每个学生的数据包括学号、班级、姓名、三门课成绩。从键盘输入N 个 学生数据&#xff0c;要求打印出每个学生三门课的平均成绩&#xff0c;以及平均分最高分学生数据&#xff08;包括学…

Java项目:61 ssm基于java的健身房管理系统的设计与实现+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于ssm Vue的健身房管理系统 角色:管理员、用户、教练、游客 管理员:管理员登录系统后&#xff0c;可以对个人中心、会员管理、器材管理、课程管理…

操作系统DC分析1

通过显示窗口过程来分析一下DC 要将内容显示在屏幕上&#xff0c;1、方法bios中断&#xff0c;2、写端口&#xff0c;3、写内存&#xff0c;其他&#xff08;暂时不知道&#xff09; 本次采用的写内存方法&#xff0c; 显卡有一个内存&#xff0c;只要将要显示的内容写入内存…

Conda 环境迁移

1. 进入需要迁移的环境&#xff1a; conda activate yolov8 2.打包迁移环境&#xff0c;注意安装打包库 pip install conda-packconda pack -n yolov83. 转移打包的环境包&#xff0c;放到anaconda/envs 下面, 在envs 下面新建环境文件夹&#xff0c;解压环境包到&#xff1…

JS核心知识点 - 赋值、浅拷贝、深拷贝。

一、理解基础数据类型和引用数据类型 基础数据类型&#xff1a; 字符串&#xff08;String&#xff09;&#xff1a;表示文本数据&#xff0c;使用引号括起来。数字&#xff08;Number&#xff09;&#xff1a;表示数值数据&#xff0c;包括整数和浮点数。布尔值&#xff08;Bo…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2010-3863)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.1.0以前的版本中&#xff0c;shiro 进行权限验证前未对url 做标准化处理&#xff0c;攻击者可以构造/、//、…

[ Linux ] vim的使用(附:命令模式的常见命令列表)

1.下载安装 这里是在通过yum进行下载安装 yum install -y vim 2.了解 vim是一款编辑器&#xff0c;它具有多模式的特点 主要有&#xff1a;插入模式&#xff0c;命令模式&#xff0c;底行模式 3.使用 打开 vim 文件名 命令模式的常见命令列表 插入模式 按「 i 」切换…

A Survey on Multimodal Large Language Models

目录 1. Introduction2. 概述方法多模态指令调优 3.1.1 简介3.1.2 预备知识3.1.3 模态对齐3.1.4 数据3.1.5 模态桥接3.1.6 评估 3.2.多模态情境学习3.3.多模态思维链3.3.1 模态桥接3.3.2 学习范式3.3.3 链配置3.3.4 生成模式3.4.LLMs辅助视觉推理3.4.1 简介3.4.2 训练范式3.4.3…