环境
springboot:2
前言
情况是这样的:
- 对新建的项目,进行模块调整:按照DDD的架构,设计各个module。
- 当把启动类
Application.java
调整包路径后,发现单元测试执行失败; - 调整的具体操作是,将原有的包
com.alibaba.模糊.模糊
改为com.alibaba.模糊.模糊.start
。也就是加了一个start
路径。 - 然后又将启动类的包路径还原回去后,单元测试执行成功。
- 纠结了一下午,加一晚上终于找到原因了。特此记录下。
当执行单元测试时,会报错,我们看到下图红线处的提示,Mybatis尝试在
com.alibaba.模糊.模糊.start
这个包下扫描
mapper
时,在这个包下找不到相关的
mapper
。
我把红线处的错误,单独贴出来,如下:
o.m.s.mapper.ClassPathMapperScanner:NoMyBatis 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
进行指定包路径。
版权归原作者 山鬼谣me 所有, 如有侵权,请联系我们删除。