最近在做一個項目,采用SpringBoot整合MybatisPlus開發,由於mapper.xml文件和mapper路徑地址不一致,導致做單元測試報異常
application.yml配置如下:
寫了個單元測試的代碼:
@RunWith(SpringRunner.class) @SpringBootTest(classes = CTScmApplication.class) public class ServiceTest { @Resource private BuyerMapper buyerMapper; @Test public void test() { System.out.println("test =" + buyerMapper.selectSum()); } }
配置沒有問題,但運行單元測試卻拋了異常信息:
其實XML是有配置 selectSum 方法的,不做單元測試,在項目里其實是可以正常執行的。
不得已,debug源碼才發現,Mybatis啟動后會加載mapper.xml配置文件中的SQL放入一個方法MAP,然后根據mapper的方法名作為 statementId (這個應該很熟悉了,就是xml里配置的id,這里是 selectSum) 去方法MAP里取SQL,這里拋異常其實就是在方法MAP里沒有get出來。
最后發現application.yml文件中的加載mapper.xml配置文件的路徑由
classpath:/com/ihanchen/*/mapper/xml/*.xml
修改為classpath*:/com/ihanchen/*/mapper/xml/*.xml
就可以運行成功,應該是mapper xml文件沒有放到測試類路徑下,而是放在項目類路徑下,測試類路徑掃描不到項目類路徑下的文件則會導致報異常。
classpath只會掃描當前項目中的路徑,而classpath*會掃描當前類路徑和依賴的jar包等的類路徑,個人猜測classpath*也會掃描target目錄下所有的類路徑。