0


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: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

进行指定包路径。


本文转载自: https://blog.csdn.net/u013066244/article/details/123099207
版权归原作者 山鬼谣me 所有, 如有侵权,请联系我们删除。

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

还没有评论