springboot学习笔记:执行单元测试时,mapper默认扫描路径为启动类的包名

本文主要是介绍springboot学习笔记:执行单元测试时,mapper默认扫描路径为启动类的包名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境

springboot:2

前言

情况是这样的:

  1. 对新建的项目,进行模块调整:按照DDD的架构,设计各个module。
  2. 当把启动类Application.java调整包路径后,发现单元测试执行失败;
  3. 调整的具体操作是,将原有的包com.alibaba.模糊.模糊改为com.alibaba.模糊.模糊.start。也就是加了一个start路径。
  4. 然后又将启动类的包路径还原回去后,单元测试执行成功。
  5. 纠结了一下午,加一晚上终于找到原因了。特此记录下。

在这里插入图片描述
当执行单元测试时,会报错,我们看到下图红线处的提示,Mybatis尝试在com.alibaba.模糊.模糊.start这个包下扫描mapper时,在这个包下找不到相关的mapper
在这里插入图片描述
我把红线处的错误,单独贴出来,如下:

o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.alibaba.模糊.模糊.start]' package. Please check your configuration.

根据提示,是com.alibaba.模糊.模糊.start这个包路径下,没有找到mapper
但是我的mapper类,本来就不在[com.alibaba.模糊.模糊.start]路径下,该路径是启动类的包路径。
在这里插入图片描述

单元测试mapper扫描的包路径默认是启动类的路径

由上面的情况,我们可以知道:单元测试mapper扫描的包路径默认是启动类的路径
因为我的项目是按照DDD模式,进行模块化的,XxxMapper类,在infrastructure模块中,其包路径是:com.alibaba.模糊.模糊.infrastructure

要解决这个问题,有两种办法:

方法一: 在单元测试里,加@MapperScan指定扫描路径
在这里插入图片描述
即:@MapperScan("com.alibaba.模糊.模糊.infrastructure")

这种改法有个缺点,就是每次单元测试用例都得加,一百个单元测试,得加一百遍。

方法二:在启动类中指定@MapperScan

在这里插入图片描述
即:@MapperScan("com.alibaba.模糊.模糊.infrastructure.模糊.mybatis")

这样就不用每次都在单元测试里面添加了。

加餐

知识背景:

@Mapper及@MapperScan注解是Spring boot Mybatis的注解,并非属于SpringBoot。

所以单独使用@Mapper而不使用@MapperScan是没问题的

这个项目脚手架生成的代码,只使用了@Mapper,并没有在启动类中用@MapperScan
在这里插入图片描述
也就是说,如果你的项目一开始就是在启动类中使用:@MapperScan,那么你都不会遇到这个问题;

总结

单元测试的扫描路径范围默认是和主启动类一致的。即使在application.properties或者test.properties中指定了mybatis.config-location也是没用的:

# mybatis 即使指定了,单元测试也不会用到。
mybatis.config-location=classpath:/mybatis/mybatis-config.xml

需要使用@MapperScan进行指定包路径。

这篇关于springboot学习笔记:执行单元测试时,mapper默认扫描路径为启动类的包名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(