2013-07-18 62 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的实际设置进行比较。

使用给定的代码单独一个工作测试样本并不实际。