- 浏览: 311332 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 4981藉由了解Spring的框架组成,我们可以了解框架之中的类与 ... -
Spring入门19 - ModelAndView类别
2011-03-14 08:07 1351入门 19 - ModelAndView类别 ... -
DispatcherServlet定义档
2011-03-14 08:07 884DispatcherServlet预设使用servlet名 ... -
入门 17 - 第一个Spring MVC Web程序
2011-03-14 08:06 1117进行这个程序之前,请您先完成入门 04 - 第一个Spri ... -
入门 16 - BeanFactoryPostProcessor接口
2011-03-14 08:05 1012撰写Bean定义档通常使用XML来撰写,XML阶层式的组织 ... -
入门 15 - Aware相关接口
2011-03-14 08:05 991Spring中提供一些Aware相关接口,像是BeanFa ... -
入门 14 - 资源文件的取得
2011-03-14 08:04 883首先来看看ApplicationContext接口的实作 ... -
入门 13 - MessageResource接口
2011-03-14 08:03 1124ApplicationContext继承了org.spri ... -
入门 12 - ApplicationContext接口
2011-03-14 08:03 913在Spring中,BeanFactory提供的是个比较API层 ... -
入门 11 - DataSource注入
2011-03-14 08:02 1060对于不同的数据库存取需求,我们使用JDBC来解决这个 ... -
入门 10 - 集合对象注入
2011-03-14 08:01 822对于像数组、java.util.List、java. ... -
入门 09 - 属性参考与自动绑定
2011-03-14 08:00 872在定义Bean时,除了直接指定值给属性值之外,还可以直接参 ... -
入门 08 - 不使用XML定义档
2011-03-14 07:59 849XML档案的阶层格式非常适用于于组态设定,也因此几 ... -
入门 07 - Bean生命周期
2011-03-14 07:59 796在Spring中,从BeanFactory取得的实 ... -
入门 06 - Bean定义档进阶读取
2011-03-14 07:58 873BeanFactory可以接受InputStrea ... -
Constructor注入
2011-03-14 07:57 1052Spring鼓励的是setter injection,但也 ... -
第一个Spring程序
2011-03-14 07:57 879首先我们要先取得Sprin ... -
入门 03 - 依赖注入DI
2011-03-14 07:56 863IoC模式基本上是一个高层的概念,在Martin Fow ... -
控制反转IoC
2011-03-14 07:55 840IoC全名Inversion of Control,如果 ... -
简介 Spring
2011-03-14 07:54 784入门 01 - 简介 Spring Spring是轻量 ...
相关推荐
- 编写单元测试确保各个组件的正确性。 - 使用JUnit等测试框架。 **2. 功能测试** - 对整个系统的功能进行测试。 - 确保所有功能正常运行。 **3. 日志记录** - 记录关键信息以便于调试和监控。 **4. 部署** ...
7. **测试与调试**:教程还可能包含如何使用JUnit或其他工具进行单元测试,确保购物车功能的正确性,以及如何在MyEclipse中调试代码,查找和修复问题。 8. **部署与运行**:最后,学习者会了解如何将完成的项目打包...
- 单元测试:使用JUnit和其他测试工具,可以对Spring MVC的Controller进行单元测试。 - 转发与重定向:使用RedirectView和ModelAndView进行请求转发和重定向。 - 处理AJAX请求:Spring MVC支持JSON或其他格式的响应...
由于MVC架构的分层设计,各部分职责明确,使得编写单元测试变得更加容易。开发者可以通过NUnit、xUnit等测试框架对模型、控制器和业务逻辑进行独立测试。 9. **AJAX支持**: Asp.NET MVC集成了JQuery库,提供对...
5. 测试:进行单元测试、集成测试,确保功能正确无误。 6. 部署:将应用部署到服务器,进行实际环境的运行。 ### 6. 教学价值 对于初学者,这个项目提供了实践J2EE技术的机会,包括理解MVC模式、使用JDBC操作...
- `opendaylight-assembleit-skiput.launch`: 编译所有bundle,但不进行单元测试。 - `opendaylight-assembleit-sonar.launch`: 编译所有bundle并运行Sonar(Code Coverage, Static Analysis tool)。 - `opendaylight...
- 单元测试:针对独立组件的功能验证。 - 集成测试:检查组件间交互。 - 系统测试:整体行为的评估。 - 回归测试:确保修改未引入新问题。 - 性能测试:评估系统性能边界。 #### 4. 正交表测试用例设计 - **...
- **可测试性**:易于进行单元测试、集成测试等各种测试。 - **可配置性**:通过配置文件等手段调整程序行为。 - **可实施性**:易于部署到生产环境中。 - **可维护性**:代码清晰,便于后期维护和升级。 - **完备的...
- 使用 MockMvc 进行单元测试,模拟 HTTP 请求并验证响应结果。 通过这个快速入门教程,你可以掌握 SpringMVC 的基本使用方法,为进一步深入学习和开发基于 SpringMVC 的 Web 应用打下坚实的基础。在实践中,你...
- **JUnit 测试**:使用 JUnit 和 Mockito 等工具进行单元测试。 - **Mockito**:模拟 Controller 依赖的对象,以确保测试只关注 Controller 的逻辑。 #### 八、Spring MVC 前后端交互 - **AJAX 请求处理**:...
10. **单元测试与集成测试**:Spring支持JUnit和Mockito等工具进行单元测试,同时通过Spring Test模块进行集成测试,确保代码质量。 通过分析这个项目代码,初学者可以了解如何创建Spring配置,定义Bean,使用注解...
`spring-boot-starter-test`起步依赖包含了JUnit、Mockito、Hamcrest等测试库,便于编写单元测试和集成测试。 九、监控与管理 SpringBoot Actuator提供了应用监控和健康检查功能,可以通过HTTP端点暴露应用的运行时...
【loadRunner入门教学详细讲解】 LoadRunner是一款由Micro Focus公司开发的企业级性能测试工具,它广泛应用于软件性能测试,能够模拟大量并发用户,检测系统在高负载下的性能表现。本教学文档将帮助初学者深入了解...
同时,JUnit用于单元测试,能确保业务逻辑的正确性。Apache Commons库,如IO、Lang等,提供了丰富的辅助功能,可以极大地提高开发效率。 至于"lib"文件夹,这通常是项目依赖的库文件,包含Struts1.2框架本身和其他...
1. 单元测试:通过JUnit(Android)、XCTest(iOS)等工具确保代码模块的正确性。 2. 模拟器与真机测试:在不同设备上运行应用,检查兼容性和性能。 六、发布与更新 1. 应用商店提交:遵循Google Play Store或App...
- 使用 `MockMvc` 进行单元测试,模拟 HTTP 请求,验证 Controller 的行为。 9. **最佳实践** - 分离业务逻辑和服务层,保持 Controller 轻量。 - 使用 RESTful 风格的 URL 设计。 - 适当使用模板引擎,提高...
Spring MVC 提供了 `MockMvc` 工具,可以方便地进行 Controller 的单元测试。 9. **RESTful API 设计**: Spring MVC 支持创建符合 REST 风格的 API,利用 HTTP 方法(GET、POST、PUT、DELETE)和 URI 来表示资源...
#### 三十二、单元测试的主要内容 - **验证模块逻辑**:确保每个函数按预期工作。 - **边界条件测试**:检查极端情况下的表现。 - **错误处理**:测试异常处理机制。 #### 三十三、集成测试的主要内容 - **接口...