2013-07-18 83 views
0

我的任務是爲MVC框架工作創建Unit Testing。我試圖在谷歌搜索它,而不是隻是MVC,我看到的是爲Spring MVC。

我對JUnit測試的基本語法有一些想法
我是單元測試新手,所以我只知道那麼多。

那麼請你給我一個關於如何單元測試MVC的示例。我真的必須設置Required Dependencies with Maven嗎?

MVC框架單元測試java

UPDATE:

/** 
* Servlet implementation class LoginController 
*/ 
public class LoginController extends HttpServlet { 
    /** 
    * Determines the version number for this serializable class. 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public LoginController() { 
     super(); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    { 
     Logger log = Logger.getLogger(getClass()); 
     HttpSession session = request.getSession(); 
     String username = request.getParameter(SessionUtility.USERNAME); 
     String password = request.getParameter(SessionUtility.PASSWORD); 
     RequestDispatcher rd = null; 
     boolean withError = false; 

     if(request.getParameter(RegistrationController.UPDATE_PASSWORD_BUTTON) != null && 
      request.getParameter(RegistrationController.UPDATE_PASSWORD_BUTTON).equalsIgnoreCase("updatepass")) 
     { 
      String userId = request.getParameter("userid"); 
      String newPassword = request.getParameter("newpassword"); 
      String oldPassword = request.getParameter("oldpassword"); 

      UsersDAO userDAO = new UsersDAO(); 

      if(userDAO.isUserPasswordMatch(userId, oldPassword)) 
      { 
       userDAO.setNewPassword(newPassword, userId); 
       request.getSession().setAttribute(ProntoUtility.SUCCESS_MESSAGE, "Password successfully updated."); 
      } 
      else 
      { 
       request.setAttribute(ProntoUtility.ERROR_MESSAGE, "Old password did not match."); 
      } 
      rd = request.getRequestDispatcher(ProntoUtility.STATE_TABLE_DISPLAY); 
      try 
      { 
       rd.forward(request, response); 
      } 
      catch(ServletException e) 
      { 

       log.error("ServletException"); 
      } 
      catch(IOException e) 
      { 

       log.error("IOException"); 
      } 
      return; 
     } 
     else if(session.getAttribute(SessionUtility.SESSION_NAME) != null) 
     { 
      session.getAttribute(SessionUtility.SESSION_TYPE); 
      rd = request.getRequestDispatcher(ProntoUtility.STATE_TABLE_DISPLAY); 

      withError = true; 
     } 
     else if((username == null || password == null) && !withError) 
     { 
      rd = request.getRequestDispatcher(ProntoUtility.LOGIN_PAGE); 
      withError = true; 
     } 
     else if((username == "" || password == "") && !withError) 
     { 
      request.setAttribute(ProntoUtility.ERROR_MESSAGE, "Please fill-up the required fields."); 
      rd = request.getRequestDispatcher(ProntoUtility.LOGIN_PAGE); 
      withError = true; 
     } 
     else if(!withError) 
     { 

      String encryptedPassword = PasswordEncryption.encryptPassword(password); 

      UsersDAO usersDAO = new UsersDAO(); 
      UsersModel login = usersDAO.getUsernamePassword(username, encryptedPassword); 

      if(login != null) 
      { 

       String usernameDB = login.getUsername(); 
       String passwordDB = login.getPassword(); 
       String teamId = login.getTeamId(); 
       String userName = login.getUsername(); 
       int userId = login.getUserId(); 

       if(usernameDB.equals(username) && passwordDB.equals(encryptedPassword)) 
       { 
        session.setAttribute(SessionUtility.USERNAME, userName); 
        session.setAttribute(SessionUtility.SESSION_TEAM, teamId); 
        session.setAttribute(SessionUtility.SESSION_ID, userId); 
        session.setAttribute(SessionUtility.SESSION_NAME, usernameDB); 
        session.setAttribute(SessionUtility.SESSION_TYPE, login.getType()); 
        session.setAttribute(SessionUtility.SESSION_PROJECT, login.getProjectId()); 
        session.setAttribute(SessionUtility.SESSION_PROJECT_NAME, login.getProjectName()); 

        rd = request.getRequestDispatcher(ProntoUtility.STATE_TABLE_DISPLAY); 
        withError = true; 
       } 
       else if(!withError) 
       { 
        request.setAttribute(ProntoUtility.ERROR_MESSAGE, "Incorrect username/password."); 
        rd = request.getRequestDispatcher(ProntoUtility.LOGIN_PAGE); 
        withError = true; 
       } 
      } 
      else if(!withError) 
      { 
       request.setAttribute(ProntoUtility.ERROR_MESSAGE, "Incorrect username/password."); 
       rd = request.getRequestDispatcher(ProntoUtility.LOGIN_PAGE); 
       withError = true; 

      } 
     } 

     try 
     { 
      if(withError == true) 
      rd.forward(request, response); 
     } 
     catch(ServletException e) 
     { 
      log.debug("Unable to forward to requested dispatcher", e); 
     } 
     catch(IOException e) 
     { 
      log.debug("Null forward request", e); 
     } 
     return; 
    } 

    /** 
    * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, 
    *  javax.servlet.http.HttpServletResponse) 
    */ 
    @Override 
    public void doPost(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse) 
    { 
     doGet(paramHttpServletRequest, paramHttpServletResponse); 
    } 
} 

我說我的工作項目的樣本控制器。

+0

如果您使用Google,則可以使用「-spring」告知Google返回沒有「spring」的頁面。 – sjngm

+0

@sjngm我試圖用「-spring」進行搜索,但似乎還沒有爲MVC框架進行單元測試的教程。我如何UnitTest控制器?我是否必須將它與模型和視圖相關聯,而我在進行測試? – newbie

+0

這將是值得發佈一些簡化的代碼示例,顯示您正在測試的代碼 - 儘管MVC模式已經很好建立,並且(如果實現的很好)確實支持良好的單元測試,但不同的人對模式的解釋不同,因此沒有'一刀切'的解決方案來測試MVC的實現。 – robjohncox

回答

0

如何使用junit進行單元測試?

如果你說自己現在:「但我想測試MVC,學習不是單元測試在理論上是如何工作的」,那麼這裏就是回覆:

單元測試手段來測試一個類或單位(以Java是一個類),而不受其他類的干擾。當然,一個應用程序有不止一個類,它們使用對方。但是,對於mock objects,您可以提供經過測試的類對象,它只提供類所需的必要事項,但不是測試類在運行時使用的類的對象。模擬對象只是看起來和感覺像真實的對象。您可以準確指定它們將在什麼方法調用時返回的值。

通過這種方式,您可以測試一個單獨的類而不會產生任何其他類干擾。因此可以很容易地檢測到問題(只有一個可能的來源)。通常你會爲每個班級編寫一個單元測試用例。

由於這是一個每類解決方案,因此您使用的框架基本上並不重要。但是一些框架支持測試(完全是單元測試,支持依賴注入),而其他框架則不支持(例如很多單例)。

我該如何測試給定的類?

那麼只寫一個JUnit測試用例(好的IDE支持你)。如果這個類擴展了另一個類而不是,那麼您的代碼就像編寫一個只有Object作爲父類的類的測試一樣簡單。你不必測試父母的方法,只需要你自己的方法。 理想情況下,構造函數沒有副作用。它只是將一個對象初始化爲一個穩定狀態,但不會啓動其他操作。這樣你甚至可以在你自己的代碼庫中單元測試擴展類的類。由於父類僅用於構造函數(也可能是類中的某些方法調用),因此可以集中測試子類的方法。

當你爲你的每個類編寫一個單元測試時,你對父類也是如此。如果問題出現在父類中,相關的測試用例會發現它(如果寫得好的話)。

回到你的問題:首先沒有什麼可以測試MVC。 MVC是一種設計模式。其次,在單元測試中,您不要測試類的交互(尋找功能測試)。

功能測試

功能測試做測試組件的某些子集的相互作用。一個功能測試可以測試CMS中的登錄。對於一次登錄,需要多個類。在測試時間表中,您首先運行單元測試,然後進行功能測試(因爲這些測試需要工作班)。無論何時不起作用,在解決問題後必須重新運行程序。

摘要

您要求進行試 「的MVC」。正如前面所解釋的那樣,沒有什麼能夠測試MVC,因爲它是一種模式。正如所示的servlet有一個巨大的方法(沒有評論這個結構是否合理)以及一個只是調用它的方法,它不是非常友好的測試。此外,該方法受到保護,所以您需要製作white-box test而不是black-box testing

功能測試可能會讓你感興趣,因爲這可以讓你實際使用多個類並測試它們的交互。例如,如果您的課程使用XYZ並更改了課程B的設置,則可以通過調用課程的方法來測試交互,然後將預期結果與課程B的實際設置進行比較。

使用給定的代碼單獨一個工作測試樣本並不實際。