如何高效测试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-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6