环境
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 进行指定包路径。
|