2013-05-12 81 views
4

我有一個簡單的方法,返回StringMockito與局部變量

它還創建了一個本地List。我想測試添加到當地List的值。

下面是一個例子

package com.impl; 

import java.util.ArrayList; 
import java.util.List; 

import com.test.domain.CustomerVo; 

public class ClassImpl { 

    public String assignGift(CustomerVo customerVo) { 
     List<String> listOfGift = new ArrayList<String>(); 

     if (customerVo.getName().equals("Joe")) { 
      listOfGift.add("ball"); 
     } else if ((customerVo.getName().equals("Terry"))) { 
      listOfGift.add("car"); 
     } else if (customerVo.getName().equals("Merry")) { 
      listOfGift.add("tv"); 
     }else { 
      listOfGift.add("no gift"); 
     } 

     return "dummyString"; 
    } 
} 

如何測試,當customerVo.getName.equals("Terry")car被添加到本地List

+2

ArrayList純粹是本地的方法,它不會被添加到CustomerVo,所以你不能測試任何東西。就好像它不存在一樣。 – 2013-05-12 10:13:45

+2

+1給Frank。該方法可以簡化爲「返回」dummyString「;」並且仍然執行相同的操作,但效率更高。 – 2013-05-12 10:23:17

+0

非常感謝答覆,基本上這是一個虛擬方法,用於詢問我們是否可以測試局部變量。 – user1999453 2013-05-12 10:30:30

回答

3

這並不是那麼容易。

您需要使用類似powermock的東西。

隨着powermock創建創建之前那麼方法被調用的場景和回放,這意味着你可以告訴ArrayList類的構造函數來預測被稱爲並返回mock,而不是一個真正的ArrayList

這將允許您在mock上聲明。

像這樣的東西應該工作:

ArrayList listMock = createMock(ArrayList.class); 
expectNew(ArrayList.class).andReturn(listMock); 

所以,當你的方法創建本地List powermock實際上將返回你的模擬List

更多信息here

這種嘲諷實際上是對遺留代碼進行單元測試,而這些遺留代碼是不可測試的。如果可以的話,我強烈建議重寫代碼,以避免發生如此複雜的嘲諷。

+2

@ user1999453我想補充說,這種測試非常脆弱,因爲它實際上取決於方法的內部實現,而不是測試其結果或效果。如果你現在需要創建第二個ArrayList呢?它有50%的機會打破測試。 – 2013-05-12 13:12:25