如何高效测试Mybatis?(xxxMapper)

2024-03-18 08:04

本文主要是介绍如何高效测试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标注的类也注入到容器中。

这篇关于如何高效测试Mybatis?(xxxMapper)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/821699

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景