2014-05-10 161 views
0

我對junit mockito非常陌生,並且嘗試使用mockito編寫junit測試用例。使用mockito的JUnit測試用例

這是我的方法,我必須寫一個junit。

public String getAllCookBooks(ChefService chefService, ChefApi chefApi) { 
    JSONObject cookBooks = null; 
    cookBooks = new JSONObject(); 
    JSONArray array = null; 
    array = new JSONArray(); 

    try { 
     if (null != chefService.listCookbookVersions()) { 
      LOG.debug(SuccessCode.COOKBOOK_DETAILS_RETRIEVED_SUCCCESS 
        .getSuccessCode() 
        + "::" 
        + SuccessCode.COOKBOOK_DETAILS_RETRIEVED_SUCCCESS 
          .getMessage()); 
      for (CookbookVersion cookbookVersion : chefService 
        .listCookbookVersions()) { 

       JSONObject cookBooksDetails = new JSONObject(); 

       cookBooksDetails.put("cookbook_name", 
         cookbookVersion.getCookbookName()); 
       cookBooksDetails.put("cookbook_version", 
         cookbookVersion.getVersion()); 

       cookBooksDetails.put("name", cookbookVersion.getName()); 
       array.put(cookBooksDetails); 
      } 
     } else { 
      LOG.info("no cookbook present..." 
        + ErrorCode.COOKBOOK_LIST_EMPTY_ERROR.getErrorCode() 
        + " : " 
        + ErrorCode.COOKBOOK_LIST_EMPTY_ERROR.getMessage()); 
      cookBooks.put("error", 
        ErrorCode.COOKBOOK_LIST_EMPTY_ERROR.getMessage()); 
     } 
     cookBooks.put("chef_cookbooks", array); 
    } catch (JSONException e) { 
     LOG.warn("JSON Exception " 
       + ErrorCode.JSON_PARSE_ERROR.getErrorCode() + " " 
       + ErrorCode.JSON_PARSE_ERROR.getMessage()); 
    } 

    LOG.debug("cookbooks: " + cookBooks.toString()); 
    LOG.info("Ended getAllCookBooks method"); 
    return cookBooks.toString(); 
} 

通過ChefService和ChefApi的方法參數是從的3rdParty API

這裏的電話chefService.listCookbookVersions()將返回一個類型CookBookVersion類的迭代器像Iterable<? extends CookbookVersion> 我沒有得到如何通過ChefService模擬對象將返回一些值進行比較的方法。

請幫忙。

+0

你沒有使用'chefApi'參數,這使得編寫模擬容易(你只有一兩件事來嘲笑),但使你的代碼不好(你沒有使用你的所有參數,那麼爲什麼它開始? – Makoto

+0

我不明白這個問題。你有沒有試圖編寫你的JUnit測試?什麼不適合你?有什麼,我們可以看看,並嘗試爲您解決? –

回答

0

你沒有傳遞任何東西。你明確告訴框架,當這個特定的調用被調用時,然後返回東西

ChefService chefServiceMock = mock(ChefService.class); 
// some reasonable, expected entry value 
List<CookbookVersion> cookbookVersions = ...; 
when(chefServiceMock.listCookbookVersions()).thenReturn(cookbookVersions); 
// You're not actually using the API object, so you can pass in null. 
// It'd be wiser to remove it altogether. 
String actual = testObject.getAllCookBooks(chefServiceMock, null); 

當你做,你會想,以確保它是所謂的,所以你會想verify呼叫。

// later 
verify(chefServiceMock).listCookbookVersions(); 

然後,確保您驗證實際結果。我見過只驗證模擬工作的測試,但實際生成的數據是垃圾。

確保它的數據您還期望從您的API輸入列表中接收。

+0

@ Makato-感謝您的答覆,該方法不應該有未使用的參數,因爲你說,將刪除該問題是我無法創建一個這裏的虛擬值與Mockito.when()比較。Like List cookbookVersions = ... – bagui

0

,你所要做的(最有可能)是:

ChefService chefService = mock(ChefService.class); // create the mock 
when(chefService.listCookbookVersions()).thenReturn(aListOfValues); // establish what would be returned on method call, in this case 'aListOfValues' 

// you could do the same for chefApi 

String result = getAllCookbooks(chefService, chefApi); // call you method 

//assert something on the result 
+0

這裏的問題是我無法創建一個值來比較。在這裏(chefService.listCookbookVersions())。然後返回(aListOfValues);我無法創建一個虛擬值來傳遞。獲得我們必須呼叫第三方返回List 的值。我如何在這裏創建一個虛擬值...任何建議? – bagui

+0

在我給你的例子中,虛擬值是'aListOfValues',你必須提供(一個控制值) –