本文主要是介绍springboot学习笔记:执行单元测试时,mapper默认扫描路径为启动类的包名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境
springboot:2
前言
情况是这样的:
- 对新建的项目,进行模块调整:按照DDD的架构,设计各个module。
- 当把启动类
Application.java调整包路径后,发现单元测试执行失败; - 调整的具体操作是,将原有的包
com.alibaba.模糊.模糊改为com.alibaba.模糊.模糊.start。也就是加了一个start路径。 - 然后又将启动类的包路径还原回去后,单元测试执行成功。
- 纠结了一下午,加一晚上终于找到原因了。特此记录下。

当执行单元测试时,会报错,我们看到下图红线处的提示,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默认扫描路径为启动类的包名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!