Jmockit的小坑-eclipse和mvn命令列執行結果不一致的問題
阿新 • • 發佈:2019-01-10
之前用了不少Jmockit寫用例,多數還好,但是之前出現了一些問題,主要的問題是一些用例,使用eclipse執行時ok的,但是用mvn命令進行測試確無法通過,錯誤的大致資訊如下:
mockit.internal.expectations.invocation.MissingInvocation: Missing 1 invocation to: com.xxx.RegionService#getByRegionId(0) on mock instance: [email protected] at com.xxx.core.xxx.SomeTest.testXXX(SomeTest.java:38)
是一個MissingInvocation,意思很簡單,就是本來應該有一次呼叫,但實際上沒有執行。資訊不難理解,麻煩的是2種環境的測試結果不一致。方法的宣告是這樣的:
Region getByRegionId(Integer regionId);
我的測試程式碼時這樣寫的:
new Expectations(){ { regionService.getByRegionId(3); times = 1; result = new RegionDTO(3,"縣名稱"); } };
場景是這樣的:regionService是個外部的dubbo服務,CUT裡面,我需要根據地區的ID獲取地區名稱,會呼叫regionService.getByRegionId。 我在測試的時候使用Expectations來mock了getByRegionId的返回值。很簡單的測試,但是測試結果在mvn命令列執行的時候始終無法執行通過。網上搜索了半天沒什麼結果。在之前我都用Mockito的mock物件代替了Jmockit這種打樁方式,可以通過,但畢竟是權宜之計。
今天不是太忙,所以花時間解決了這個問題。其實也是搜尋無果的情況下找出來的。原因就是getByRegionId方法接收的引數是Integer的物件型別(Integer),而我測試程式碼傳遞的是基礎型別的值(3),命令列執行的時候,會認為這不是一個物件,沒有算作真正呼叫了,導致了這個錯誤。最後我的測試程式碼寫成了:
new Expectations(){
{
regionService.getByRegionId(new Integer(3));
times = 1;
result = new RegionDTO(3,"縣名稱");
}
};
即傳參的時候使用了物件型別的引數值:regionService.getByRegionId(new Integer(3));,這樣就可以通過了。
至於為什麼在Eclipse下怎麼寫都能通過我是不得而知,誰如果知道的話,請不吝賜教。