`
gaoyuntao2005
  • 浏览: 312490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

入门 21 - Controller的单元测试

阅读更多


 现在假设您要设计一个窗体登入Web程序,程序中有一个窗体登入页面,一个验证使用者名称与密码是否正确的LoginAction,以及一个登入成功页面,我们打算使用Spring的MVC框架来实现。 
 这个窗体登入程序最主要的当然就是验证使用者名称与密码是否正确的LoginAction,另两个只是页面呈现而已,我们希望对这个LoginAction进行单元测试,并希望采用「测试驱动」来进行程序开发,为此,我们要先设计好测试案例(TestCase)。 
 无疑的,我们的LoginAction必须从Request中取得窗体登入信息,然而这么作的话,我们的TestCase势必与Servlet容器相依赖,因而无法独立的进行纯綷的单元测试,而是「容器内测试」了,为了能独立于容器进行单元测试,我们设计一个LoginForm,它负责储存 Request中的窗体登入信息,而LoginAction上拥有一个handleForm()方法,专门负责处理LoginForm对象并返回一个 ModelAndView对象。 
 先不用考虑LoginForm如何从Request中收集登入信息,纯就上面的设计来考量,我们可以让我们的LoginAction与容器解耦合,以实现LoginAction的单元测试,在这边我们使用JUnit来进行测试,我们先写下以下的测试案例:

TestSpringappController.java

package onlyfun.caterpillar.test;

 

import junit.framework.TestCase;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import org.springframework.web.servlet.ModelAndView;

import onlyfun.caterpillar.LoginAction;

import onlyfun.caterpillar.LoginForm;

 

public class TestSpringappController extends TestCase {

    private LoginAction loginAction;

    private LoginForm form;

   

    public static void main(String[] args) {

        junit.textui.TestRunner.run(TestSpringappController.class);

    }

 

    protected void setUp() throws Exception {

        super.setUp();

        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("/WEB-INF/hello-servlet.xml");

        loginAction = (LoginAction) applicationContext.getBean("loginAction");

        form = new LoginForm();

    }

 

    public void testLoginCorrect() {

        form.setUsername("caterpillar");

        form.setPassword("123456");

        ModelAndView modelAndView = loginAction.handleForm(form);

        assertEquals(loginAction.getSuccessView(), modelAndView.getViewName());

    }

   

    public void testLoginInCorrect() {

        form.setUsername("somebody");

        form.setPassword("123456");

        ModelAndView modelAndView = loginAction.handleForm(form);

        assertEquals(loginAction.getFormView(), modelAndView.getViewName());

      

        form.setUsername("caterpillar");

        form.setPassword("111111");

        modelAndView = loginAction.handleForm(form);

        assertEquals(loginAction.getFormView(), modelAndView.getViewName());

    }

}


 LoginAction中设定有getFormView()与getSuccessView(),分别表示登入失败与成功的页面,我们与 handleForm()传回的ModelAndView中的ViewName作断言,登入失败时使用getViewNAme()取得的名称,应该与 LoginAction的getFormView()取得的名称相同,而登入成功时使用getViewNAme()取得的名称,应该与 LoginAction的getSuccessView()取得的名称相同。注意到这个测试案例并没有使用到与Servlet API相关的对象,是个纯綷的单元测试。 

 依测试案例,我们可以设计我们的LoginForm与LoginAction,首先LoginForm如下,只是个纯綷的JavaBean:

LoginForm.java

package onlyfun.caterpillar;

 

public class LoginForm {

    private String username;

    private String password;

   

    public void setUsername(String username) {

       this.username = username;

    }

   

    public void setPassword(String password) {

       this.password = password;

    }

   

    public String getUsername() {

       return username;

    }

   

    public String getPassword() {

       return password;

    }

}

 

LoginAction.java

package onlyfun.caterpillar;

 

import java.io.IOException;

import javax.servlet.*;

import javax.servlet.http.*;

import org.springframework.web.servlet.mvc.Controller;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.bind.RequestUtils;

 

public class LoginAction implements Controller {

    private String successView;

    private String formView;

    

    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        String username = RequestUtils.getRequiredStringParameter(req, "username");

        String password = RequestUtils.getRequiredStringParameter(req, "password");

        LoginForm form = new LoginForm();

        form.setUsername(username);

        form.setUsername(password);

      

       return handleForm(form);

    }

   

   public ModelAndView handleForm(Object formObject) {

       LoginForm form = (LoginForm) formObject;

       

       if("caterpillar".equals(form.getUsername()) &&

             "123456".equals(form.getPassword())) {

          return new ModelAndView(this.getSuccessView(),"user", form.getUsername());

       }

       else {

            return new ModelAndView(this.getFormView());

        }

    }

   

    public String getFormView() {

        return formView;

    }

 

    public void setFormView(String formView) {

        this.formView = formView;

    }

 

    public String getSuccessView() {

        return successView;

    }

 

    public void setSuccessView(String successView) {

        this.successView = successView;

    }

}


 在LoginAction中可以看到,透过LoginForm来收集Request中的参数,之后交给我们自订的handleForm(),我们可以实现与Servlet API的解耦合,使得单元测试变的可能。 
当然,别忘了我们还要撰写Bean定义档:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">

        <property name="successView">

            <value>/WEB-INF/jsp/success.jsp</value>

        </property>

        <property name="formView">

            <value>/html/form.htm</value>

        </property>

    </bean>

</beans>


 接下来您可以运行测试案例来进行测试了,在测试无误之后,我们就可以继续进行Spring MVC框架中其它的组件(component)配置了

分享到:
评论

相关推荐

    Grails入门指南-中文版

    - 编写单元测试确保各个组件的正确性。 - 使用JUnit等测试框架。 **2. 功能测试** - 对整个系统的功能进行测试。 - 确保所有功能正常运行。 **3. 日志记录** - 记录关键信息以便于调试和监控。 **4. 部署** ...

    j2ee入门教程---几个购物车

    7. **测试与调试**:教程还可能包含如何使用JUnit或其他工具进行单元测试,确保购物车功能的正确性,以及如何在MyEclipse中调试代码,查找和修复问题。 8. **部署与运行**:最后,学习者会了解如何将完成的项目打包...

    SpringMVC快速入门教程-深入分析

    - 单元测试:使用JUnit和其他测试工具,可以对Spring MVC的Controller进行单元测试。 - 转发与重定向:使用RedirectView和ModelAndView进行请求转发和重定向。 - 处理AJAX请求:Spring MVC支持JSON或其他格式的响应...

    Asp.ne2.0MVC实战入门教程-上-基础准备篇

    由于MVC架构的分层设计,各部分职责明确,使得编写单元测试变得更加容易。开发者可以通过NUnit、xUnit等测试框架对模型、控制器和业务逻辑进行独立测试。 9. **AJAX支持**: Asp.NET MVC集成了JQuery库,提供对...

    JAVA入门项目-基于J2EE的绩效考核系统

    5. 测试:进行单元测试、集成测试,确保功能正确无误。 6. 部署:将应用部署到服务器,进行实际环境的运行。 ### 6. 教学价值 对于初学者,这个项目提供了实践J2EE技术的机会,包括理解MVC模式、使用JDBC操作...

    Open Daylight Controller简易入门

    - `opendaylight-assembleit-skiput.launch`: 编译所有bundle,但不进行单元测试。 - `opendaylight-assembleit-sonar.launch`: 编译所有bundle并运行Sonar(Code Coverage, Static Analysis tool)。 - `opendaylight...

    软件测试经典面试题软件测试经典笔试题.pdf

    - 单元测试:针对独立组件的功能验证。 - 集成测试:检查组件间交互。 - 系统测试:整体行为的评估。 - 回归测试:确保修改未引入新问题。 - 性能测试:评估系统性能边界。 #### 4. 正交表测试用例设计 - **...

    软件测试经典试题

    - **桩模块**:模拟子组件,用于单元测试。 - **驱动模块**:模拟主程序,用于测试被测模块。 #### 23. 扇入与扇出 - **扇入**:一个模块直接调用的其他模块数。 - **扇出**:直接调用一个模块的其他模块数。 ####...

    J2EE入门-经典

    - **可测试性**:易于进行单元测试、集成测试等各种测试。 - **可配置性**:通过配置文件等手段调整程序行为。 - **可实施性**:易于部署到生产环境中。 - **可维护性**:代码清晰,便于后期维护和升级。 - **完备的...

    SpringMVC 快速入门

    - 使用 MockMvc 进行单元测试,模拟 HTTP 请求并验证响应结果。 通过这个快速入门教程,你可以掌握 SpringMVC 的基本使用方法,为进一步深入学习和开发基于 SpringMVC 的 Web 应用打下坚实的基础。在实践中,你...

    spring MVC快速入门-深入分析.pdf

    - **JUnit 测试**:使用 JUnit 和 Mockito 等工具进行单元测试。 - **Mockito**:模拟 Controller 依赖的对象,以确保测试只关注 Controller 的逻辑。 #### 八、Spring MVC 前后端交互 - **AJAX 请求处理**:...

    Spring框架入门-项目代码.rar

    10. **单元测试与集成测试**:Spring支持JUnit和Mockito等工具进行单元测试,同时通过Spring Test模块进行集成测试,确保代码质量。 通过分析这个项目代码,初学者可以了解如何创建Spring配置,定义Bean,使用注解...

    springboot入门,springboot-demo

    `spring-boot-starter-test`起步依赖包含了JUnit、Mockito、Hamcrest等测试库,便于编写单元测试和集成测试。 九、监控与管理 SpringBoot Actuator提供了应用监控和健康检查功能,可以通过HTTP端点暴露应用的运行时...

    loadRunner入门教学详细讲解--文档

    【loadRunner入门教学详细讲解】 LoadRunner是一款由Micro Focus公司开发的企业级性能测试工具,它广泛应用于软件性能测试,能够模拟大量并发用户,检测系统在高负载下的性能表现。本教学文档将帮助初学者深入了解...

    快乐编程-知识分享-Struts1.x学习-1.2入门-001

    同时,JUnit用于单元测试,能确保业务逻辑的正确性。Apache Commons库,如IO、Lang等,提供了丰富的辅助功能,可以极大地提高开发效率。 至于"lib"文件夹,这通常是项目依赖的库文件,包含Struts1.2框架本身和其他...

    手机-PDA程序设计入门-整合型开发工具

    1. 单元测试:通过JUnit(Android)、XCTest(iOS)等工具确保代码模块的正确性。 2. 模拟器与真机测试:在不同设备上运行应用,检查兼容性和性能。 六、发布与更新 1. 应用商店提交:遵循Google Play Store或App...

    Spring MVC 从入门到精通

    - 使用 `MockMvc` 进行单元测试,模拟 HTTP 请求,验证 Controller 的行为。 9. **最佳实践** - 分离业务逻辑和服务层,保持 Controller 轻量。 - 使用 RESTful 风格的 URL 设计。 - 适当使用模板引擎,提高...

    springmvc从入门到精通的代码.rar

    Spring MVC 提供了 `MockMvc` 工具,可以方便地进行 Controller 的单元测试。 9. **RESTful API 设计**: Spring MVC 支持创建符合 REST 风格的 API,利用 HTTP 方法(GET、POST、PUT、DELETE)和 URI 来表示资源...

    最全面的软件测试面试题

    #### 三十二、单元测试的主要内容 - **验证模块逻辑**:确保每个函数按预期工作。 - **边界条件测试**:检查极端情况下的表现。 - **错误处理**:测试异常处理机制。 #### 三十三、集成测试的主要内容 - **接口...

Global site tag (gtag.js) - Google Analytics