- 浏览: 303070 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhou363667565:
看到你的这个配置 有个地方有点问题:
< aop:po ...
spring ibatis 事务配置 -
wo17796452:
[b][/b][i][/i][u][/u]引用[*][img] ...
crowd Jira confluence 集成 -
wo17796452:
<input type="button&quo ...
crowd Jira confluence 集成 -
benbear2008:
这些类图呢?
Spring MVC框架类图与顺序图 -
TTLtry:
谢了 最近学习spring时候 却总是登不上官方网站 很多 ...
Spring 2.5.5 api 帮助文档 chm格式 下载
现在假设您要设计一个窗体登入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)配置了
发表评论
-
Spring MVC框架类图与顺序图
2011-03-14 08:08 4895藉由了解Spring的框架组成,我们可以了解框架之中的类与 ... -
Spring入门19 - ModelAndView类别
2011-03-14 08:07 1312入门 19 - ModelAndView类别 ... -
DispatcherServlet定义档
2011-03-14 08:07 844DispatcherServlet预设使用servlet名 ... -
入门 17 - 第一个Spring MVC Web程序
2011-03-14 08:06 1078进行这个程序之前,请您先完成入门 04 - 第一个Spri ... -
入门 16 - BeanFactoryPostProcessor接口
2011-03-14 08:05 979撰写Bean定义档通常使用XML来撰写,XML阶层式的组织 ... -
入门 15 - Aware相关接口
2011-03-14 08:05 959Spring中提供一些Aware相关接口,像是BeanFa ... -
入门 14 - 资源文件的取得
2011-03-14 08:04 855首先来看看ApplicationContext接口的实作 ... -
入门 13 - MessageResource接口
2011-03-14 08:03 1084ApplicationContext继承了org.spri ... -
入门 12 - ApplicationContext接口
2011-03-14 08:03 877在Spring中,BeanFactory提供的是个比较API层 ... -
入门 11 - DataSource注入
2011-03-14 08:02 961对于不同的数据库存取需求,我们使用JDBC来解决这个 ... -
入门 10 - 集合对象注入
2011-03-14 08:01 777对于像数组、java.util.List、java. ... -
入门 09 - 属性参考与自动绑定
2011-03-14 08:00 826在定义Bean时,除了直接指定值给属性值之外,还可以直接参 ... -
入门 08 - 不使用XML定义档
2011-03-14 07:59 807XML档案的阶层格式非常适用于于组态设定,也因此几 ... -
入门 07 - Bean生命周期
2011-03-14 07:59 753在Spring中,从BeanFactory取得的实 ... -
入门 06 - Bean定义档进阶读取
2011-03-14 07:58 843BeanFactory可以接受InputStrea ... -
Constructor注入
2011-03-14 07:57 1017Spring鼓励的是setter injection,但也 ... -
第一个Spring程序
2011-03-14 07:57 844首先我们要先取得Sprin ... -
入门 03 - 依赖注入DI
2011-03-14 07:56 822IoC模式基本上是一个高层的概念,在Martin Fow ... -
控制反转IoC
2011-03-14 07:55 801IoC全名Inversion of Control,如果 ... -
简介 Spring
2011-03-14 07:54 753入门 01 - 简介 Spring Spring是轻量 ...
相关推荐
使用MockMvcTest,RepositoryTest,EmailTest和用于服务层的常规JUnit4测试进行单元测试的设置 通过Fluentlenium和HtmlUnit与FeatureTest进行快速UI测试 包含SCSS + Bootstrap4的样式表的前端模块 具有一些功能的...
dnd-controller-app 该项目是使用版本3.0.0-rc8。 入门 先决条件 > = v0.12.0 ( npm install --global bower ) ,然后gem install sass ( npm install --global grunt-...运行npm test将使用业力运行单元测试。
Vue Element UI快速入门项目设置yarn install$ yarn global add pm2编译和热重装以进行开发yarn run serve编译并最小化生产yarn run build运行测试yarn run test整理和修复文件yarn run lint运行端到端测试yarn run ...
tdd启动 Karma 来监视您的文件并自动运行单元测试 $ gulp tdd 子发电机 $ yo angular-next:module [name] $ yo angular-next:controller [module_name] [name] $ yo angular-next:value [module_name] [name] $ yo...
将 NuGet软件包添加到您的单元测试项目中: PM> Install-Package FluentAssertions.AspNetCore.Mvc 入门 使用之一为您的控制器编写单元测试。 以 NUnit 为例: [ Test ] public void Index_Action_Returns_View ...
应用结构基本单元测试测试运行器karma.conf 管理$ slush rwang $ npm install && bower install入门全局安装 slush 和 slush-rwang: npm -g gulp slush slush-rwang 用法使用slush rwang新组件添加:controller或...
16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体...
16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体...
12.3 单元测试用于asp.net mvc应用程序的技巧和窍门 291 12.3.1 控制器测试 291 12.3.2 路由测试 296 12.3.3 验证测试 298 12.4 小结 302 第13章 扩展asp.net mvc 303 13.1 模型扩展 304 13.1.1 把请求数据...
springboot的增删改查;使用@Valid表单验证;使用AOP处理请求;统一异常处理;单元测试Service/Controller(API)
1.7 单元测试 1.8 本章小结 第2章 groovy动态语言 2.1 groovy和java的异同 2.1.1 相同点 2.1.2 不同点 2.2 基础知识 2.1.1 类声明 . 2.2.2 语言级断言(assertion) ...
测验运行grunt test将使用业力运行单元测试。应用程序设置一个新的AngularJS应用,生成您需要入门的所有样板。 应用程序生成器还可以选择安装Bootstrap和其他AngularJS模块,例如angular-resource(默认安装)。 ...
自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 Ruby2.7.2p137 Rails版本 轨道6.1.1 我的笔记 设置: : 安装webpacker:rails ... 单元测试 RSpec入门: :
7.1. Zend_Controller 快速入门 7.1.1. 简介 7.1.2. 入门 7.1.2.1. 文件系统的组织结构 7.1.2.2. 设置文件根目录 7.1.2.3. 创建URL重写规则 7.1.2.4. 创建你的bootstrap文件 7.1.2.5. 创建默认的控制器...