2015-11-24 27 views
0

下面是我想測試的方法。我正在使用TestNG框架進行單元測試。嘲弄靜態方法

class Random{ 

    List<String> namesOfLinks; 

    public List<String> methodIwantToTest(List<String> cktNames) { 
      Map<String, Graph> maps = DataBaseReader.getGraphs(cktNames); 
      for (Entry<String, Graph> entry : maps.entrySet()) { 
       graphList.add(entry.getValue().getName()); 
      } 
    } 

    return namesOfLinks; 
} 

我正在爲上面的類中的方法「methodIwantToTest」編寫測試用例。我可以提供一些虛擬的cktNames並獲得如下執行的方法。

@Test (dataProvider = "dp") 
public void test_methodIwantToTest(List<String> cktNames, List<String> expectedLinkNames){ 
    Random rm = new Random(); 
    List<String> actual = rm.methodIwantToTest(cktNames); 
    Assert.assertEquals(actual,expectedLinkNames); 
} 

現在出現這個問題。當我在'rm'引用上調用實際方法時,它會對另一個API進行靜態方法調用。它必須返回一些東西才能使我的「方法」工作。我搜索了互聯網,發現「easymock」作爲解決方案。但我無法使用「easyMock」來模擬靜態方法(DataBaseReader.getGraphs())。我必須嘲笑該方法,以便返回已定義類型的映射。任何建議都會很棒。 謝謝!

其他問題涉及如何測試靜態方法。但是我的意圖是在測試實例方法時嘲笑靜態方法。

+1

你不能使用easymock來模擬靜態方法。你需要使用powerMock。 – proudandhonour

回答

1

我建議使用適配器模式與依賴注入技術結合使用。創建一個包含所有你需要模擬方法的接口:

public interface IDatabase { 
    Map<String, Graph> getGraphs(List<String> names); 
} 

顯然,Database沒有實現的接口,你剛剛發明(和方法是static反正),但您可以創建一個適配器類:

public class DataBaseReaderAdapter implements IDatabase { 
    public Map<String, Graph> getGraphs(List<String> names) { 
     return DataBaseReader.getGraphs(names); 
    } 
} 

把這個類作爲類的構造函數參數的情況下,你想測試:

public class Random { 
    private readonly IDatabase _database; 

    public Random(IDatabase database) { 
     _database = database; 
    } 
} 

,當你WA NT要調用的方法:

Map<String, Graph> maps = _database.getGraphs(cktNames); 

在您的測試中,使用任何嘲弄的框架來創建的IDatabase一個模擬,並模擬傳遞給Random。儘管這種技術起初看起來相當複雜,但它往往會導致更好的設計,其中類的依賴關係更加明顯,並且所有事情都變得更容易測試。