SSM项目使用junit单元测试时Mybaties通配符加载Mapper不能正常加载
个人博客 地址:http://www.wenhaofan.com/article/20181108104133
问题描述
项目使用maven build 以及tomcat run能够正常运行,但是使用junit单元测试时却报如下错误
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for CommonTermTeacherMapper.listOwnTerm
猜测是mybaties mapper未能正常加载,本项目的mapper加载配置如下
<!-- 本项目数据源代码 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 显式指定Mapper文件位置 --> <property name="configLocation" value="classpath:/SqlMapConfig.xml" /> <!-- 通配符指定Mapper.xml --> <property name="mapperLocations"> <array> <value>classpath:/mybatis/**/*Mapper.xml</value> <value>classpath:/**/*Mapper.xml</value> </array> </property> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> </bean>
解决方案
猜测junit的运行时的classpath信息与普通运行方式不同,于是将classpath修改为classpth*,使其从多个classpath中加载mapper文件
修改后的代码如下
<!-- 本项目数据源代码 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 显式指定Mapper文件位置 --> <property name="configLocation" value="classpath*:/SqlMapConfig.xml" /> <!-- 通配符指定Mapper.xml --> <property name="mapperLocations"> <array> <value>classpath*:/mybatis/**/*Mapper.xml</value> <value>classpath*:/**/*Mapper.xml</value> </array> </property> </bean>
此时junit即可正常加载运行,需要注意的是在线上环境的时候尽量将*去掉,提高检索效率
具体细节目前不再深究 项目进度重要,日后有空再来研究