2017-05-11 64 views
-4

下午好, 我有測試的布爾方法煩惱的布爾方法。 我有我的接口(DAO)測試在Java中

public interface UserDao { 
public boolean existUser(String email) throws UserException; 
} 

而且我的方法是

public boolean existUser(String email) throws UserException {  
     try{ 
      log.info("Verify exist email " + email); 
      Map<String, Object> parametersMap = Maps.newHashMap(); 
      parametersMap.put("email", email); 
      Long count = npTemplate.queryForLong("SELECT count(*) FROM DL_USER WHERE EMAIL = :email", parametersMap); 

      if(count > 0){ 
       return true; 
      } 
     }catch(Exception e){ 
      String errorMsg = "There was an exception trying obtain user id for " + email + " - ERROR " + e.getMessage(); 
      UserException uException = new UserException(errorMsg, e); 
      throw uException; 
     }  
     return false; 
    } 

我想測試existUser方法。

+1

爲什麼你不試一試,讓我們知道你面臨的問題 – pvpkiran

+0

不要捕獲(例外...),捕獲特定的檢查異常。 –

+0

*我在測試布爾方法*時遇到了麻煩。那些麻煩會是什麼? – shmosel

回答

1

創建一組測試數據,其中包含某些應產生的方法的參數true,某些false和其他例外。依次調用每個值的方法並檢查實際結果和預期結果。使用具有已知內容的數據庫,以便知道預期值應該是多少。

我更喜歡TestNG的這種類型的測試。

順便提一下,return false;應位於try區塊內,return true。然後,你可以消除boolean的測試返回一個boolean和簡單return count > 0;

1

基本上有測試這種東西有兩種方式:

一)由於盧已經建議,你能做出這樣的集成測試,這意味着你實際上是連接到數據庫,查詢用戶,等等。如果你想100%確定,你甚至可以在測試初始化​​期間創建用戶,並在之後移除用戶(例如,通過在事務中包裝整個測試並在最後進行回滾)。這將阻止您的測試依賴於特定的數據庫狀態或使數據庫與測試數據混雜在一起。

b)您也可以通過嘲笑將其作爲單元測試。爲此,您必須模擬npTemplate,不再需要實際的數據庫連接。然後,您可以驗證是否使用正確的參數調用了npTemplate。你也可以讓它返回不同的數字來測試不同的情況,甚至讓它拋出異常來測試它。 Mockito是這樣的東西去的框架,但也有其他人也(例如EasyMock)。

明顯的缺點,以解決b)是,你不能保證你的查詢實際上是正確的,它不會留下太多的測試。不過,我個人會寫兩個測試,單元測試一個集成測試,因爲單元測試將確保在你的查詢代碼和結果的處理是正確的,而集成測試將確保您的查詢的實際工作。 (是的,集成測試也將確保代碼是正確的,但運行集成測試通常需要更多的時間,所以您可以在開發過程中始終運行單元測試,只在需要時進行集成測試)。

還有一點P.S.,使用...

return count > 0; 

...會讓你的代碼更簡潔,因爲你不會有兩個不同的地方一回發生。