本文主要是介绍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默认扫描路径为启动类的包名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!