1. 程式人生 > >Jmockit的小坑-eclipse和mvn命令列執行結果不一致的問題

Jmockit的小坑-eclipse和mvn命令列執行結果不一致的問題

之前用了不少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下怎麼寫都能通過我是不得而知,誰如果知道的話,請不吝賜教。