2014-10-07 17 views
0

我有一個方法,預計會返回類型的HashMap的結果,我需要單元測試它。 該方法應該接收一個字符串並顯示每三個字符的出現次數。如何模擬預期返回HashMap的方法?

public HashMap<String,Integer> findOccurences(String myStr){ 
    return null; 
} 

我需要知道如何使用Mockito爲其編寫單元測試。

public class TestMySubString { 
    @Mock 
    private static MySubString mockedMySub; 
    private static String str; 
    private static HashMap<String,Integer> result; 

    @BeforeClass 
    public static void setUp(){ 
     str = "This This"; 
     result.put(" Th", 1); 
     result.put("s T",1); 
     result.put("his",2); 
     result.put("Thi ",2); 
     result.put("is ",1); 
     when(mockedMySub.findOccurences(str)).thenReturn(result); 
    } 

    @Test 
    public void testFindOccurences() { 
     HashMap<String,Integer> myResult = mockedMySub.findOccurences(str); 
     //assertReflectionEquals(result,myResult); 
    } 

在此基礎上question我用assertReflectionEquals但它仍然會返回一個錯誤。

+0

你能發表一個錯誤? – aviad 2014-10-07 06:39:21

+1

再去看看你鏈接到的問題。比較不在地圖之間,而是循環檢查每個條目。 – azurefrog 2014-10-07 06:39:41

+1

不可以。你不應該嘲笑你想要測試的班級。嘲笑就是消除類別的副作用,而不是你正在測試的類別。你做這一切都是錯誤的。 – 2014-10-07 06:42:28

回答

3

如果您正在嘗試執行TDD,您會發現它錯了。您應該^1

  1. 添加測試
  2. 運行所有測試,看看是否新的一個失敗
  3. 編寫一些代碼
  4. 運行測試
  5. 重構
  6. 重複

簡單而簡單,這就是你想要的。沒有嘲笑或任何東西:

public class MySubStringTest { 
private MySubString mySubString = new MySubString(); 

@Test 
public void testFindOccurences() { 
    final Map<String,Integer> myResult = mySubString.findOccurences("This This"); 
    final Map<String, Integer> expected = new HashMap<String, Integer>() { 
     { 
      put("Thi", 2); 
      put("his", 2); 
      put("is ", 1); 
      // etc 
     } 
    }; 
    assertEquals(expected, myResult); 
} 
} 

後你已經到位了這一點,你已經完成了這上面的列表中的第1步。運行它並看到它失敗(步驟2),然後爲您的方法編寫實現(步驟3)等。

當您的測試方法具有外部依賴性時,應該使用模擬。例如,您有一個方法public String getWeather(),它返回「It's hot!」或「很冷!」,這是基於對外部Web API調用某個位置的天氣。然後,你會嘲笑天氣API組件返回,它是-12攝氏度,你斷言你的方法的結果是「這很冷!」。然後在下一個測試中,您可以模擬外部API組件,返回+38攝氏度並聲明您的方法返回「It's hot!」。

+0

用於TDD提醒 – Brice 2014-10-07 15:48:48