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

AppFuse学习笔记-单元测试

阅读更多
AppFuse为几乎每一个类都提供了单元测试, 它使用JUnit框架进行测试。我们还是以User为例仔细分析一下,阅读本篇的内容之前,你至少应该已经对单元测试有一个概念。

1. DAO测试
    UserDAOTest用于测试UserDAO这个接口和它的实现UserDAOHibernate,它在test/dao/**/dao/中。
    所有的DAOTest都继承自BaseDAOTestCase,BaseDAOTestCase继承自TestCase。这个父类已经为我们写好了从Spring加载ApplicationContext的方法。
    setUp()里做了在测试之前的初始化工作,创建了UserDAO和RoleDAO的实例,tearDown()里做销毁工作,这是每个Junit测试类都要做的事。
    以testUpdateUser()方法为例,该方法主要用于测试UserDAO的saveUser()方法是否正确。首先调用getUser()获得用户“tomcat”的信息,并修改其地址,然后调用saveUser()方法保存修改的记录。重新获得“tomcat”的信息,校验其地址是否为新地址,如果地址为新地址,测试成功。接下来把“tomcat”的version属性的值置空(version为验证当前记录是否为新记录的标志,null表示新纪录),重新保存“tomcat”,此时hibernate会认为该记录为新记录,进行insert操作,但username字段为主键不能重复,因此应该抛出异常。如果捕获到异常,测试成功。
    在控制台进入项目根目录,键入ant test-dao -Dtestcase=UserDAO,如果出现BUILD SUCCESSFUL,说明测试成功。这样,我们不需要写Manager、Action、JSP,不需要运行容器也可以确保我们的类正确了。

2. Manager测试
    接下来继续看测试UserManager的类UserManagerTest。它在test/service/**/service/中,继承自BaseManagerTestCase,这个父类起着与BaseDAOTestCase类似的作用。
    与UserDAOTest不同的是UserManagerTest使用了jMock帮助其测试。jMock用于解决UserManager的依赖,因为UserManager中需要调用UserDAO的方法,而单元测试的基本规则是一次只测试一个对象,jMock帮助你把UserManager孤立起来,使它不会受到UserDAO的影响,我们来看它到底怎么做。
    在setUp()里,我们把UserDAO和RoleDAO放到Mock中,让Mock来做UserDAO和RoleDAO的代理,并将这两个“假冒的”DAO注入到UserManager中。
    还是以testSaveUser()为例来看这个test类怎么工作。首先创建User对象,设置用户名为“tomcat”,权限为“user”。然后我们告诉Mock当UserManager调用UserDAO的getUser()方法并参数是“tomcat”时,我们期待UserDAO返回我们刚刚创建的那个对象。接下来调用UserManager的getUser()方法以获得“tomcat”的信息。修改电话号码的内容。然后重置我们对Mock的要求。这次我们要求当UserManager调用UserDAO的saveUser方法时,不返回任何值。然后调用UserManager的saveUser()方法,校验user是否为新的电话号码和权限是否还是一个,若是,测试成功。verify()用于检查所有应该调用的方法是否都被调用了。通常来说,每对Mock对象调用了一次expects(),使用完后都要执行一次verify()。
    在控制台执行ant test-service -Dtestcase=UserManager,看看结果。

3. Action测试
    我们继续看test/web/**/action下的UserActionTest。它继承自BaseStrutsTestCase,BaseStrutsTestCase继承MockStrutsTestCase,这个父类也做了类似BaseManagerTestCase的工作。
    Action是一个控制器,主要用于接收视图层的请求,调用模型层的方法,然后返回视图层。在这里我们不关心模型层或视图层,我们只要关心Action是否能够正确的得到请求和响应请求,以及能够正确的根据请求转向。MockStrutsTestCase给了我们测试这方面很好的支持。
    以testSave()为例,首先创建一个UserForm,在里面放入部分数据,将UserForm放入该Action所对应的范围内。使用setRequestPathInfo()设置请求路径为“/saveUser”,使用addRequestParameter()添加好请求参数,actionPerform()方法将模拟请求的全过程。然后使用verifyForward()方法验证请求转发路径是否正确。并验证能不能在Action范围内得到UserForm。
    运行ant test-web -Dtestcase=UserAction,OK。
    要注意一点,这里的单元测试虽然继承自MockStrutsTestCase,但没有使用Mock,也就是说,它会真正执行到所有相关的方法,包括修改数据库。

4. JSP测试
    我们同样可以对JSP进行测试。这里有一个工具叫做Canoo WebTest,它使用xml配置的方式来测试JSP。
    进入test/web/,有一个web-tests.xml文件,里面有所有struts-config.xml中存在的path的测试。
    以SaveUser这个target为例,我们做一个简单的说明。测试步骤包含在steps中,invoke中给这个step定一个ID号,设置请求的url:editProfile.html。接下来验证JSP页面的title是否与预期的一致。其中{webapp.prefix}和{userProfile.title}的内容在WEB-INF\classes中的ApplicationResources中定义。接下来给表单中的文本域填写内容,使用clickbutton点击保存按钮,验证保存后的页面标题是否为预期的标题。
    这一测试需要运行容器,因此首先运行Tomcat,再在控制台键入ant test-canoo -Dtestcase=UserTests或ant test-jsp -Dtestcase=PersonTests。使用ant run-all-tests无需运行Tomcat,Ant为你做这件事。
分享到:
评论

相关推荐

    appfuse 学习笔记

    ### Appfuse 学习笔记 #### 一、Appfuse 简介 Appfuse 是一个开源框架,旨在帮助开发者高效地构建企业级应用。通过提供一套完善的架构模板、最佳实践和技术栈组合,使得开发者能够专注于业务逻辑的实现,而不是...

    appfuse-tutorial-struts-1.6.zip_appfuse

    这个"appfuse-tutorial-struts-1.6.zip"文件是一个基于Struts 1.6的AppFuse教程,用于指导开发者如何构建一个企业级的人员管理系统。Struts是Apache软件基金会下的一个开源框架,专门用于构建基于MVC(Model-View-...

    appfuse-light-webwork-spring-jdbc-1.8.2.zip_Java 8_appfuse_webwo

    在"appfuse-light-webwork-spring-jdbc-1.8.2.zip"这个压缩包中,我们能看到一个基于Java 8、WebWork、Spring和JDBC的项目实例。 **Java 8** Java 8是Java平台的重大更新,引入了许多新特性,如lambda表达式、函数...

    appfuse学习笔记(一)安装部署

    替换 `<选择的模板>` 为下载的模板名称,如 `appfuse-basic`,`appfuse-minimal` 等,`<对应版本>` 是你下载的 AppFuse 版本号。 **4. 编译与运行** 进入新创建的项目目录,使用 Maven 编译并运行项目: ``` cd my...

    appfuse-documentation-2.1.0官方文档

    综上所述,AppFuse 不仅是一个强大的开发框架,还是一个全面的学习资源库,可以帮助开发者快速掌握现代 Web 开发所需的各种技能。无论你是初学者还是有经验的开发者,都能从这份文档中获益良多。

    建立项目原型骨架的步骤(最新版本appfuse)appfuse2.1.0-M2

    `mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts-archetype -DarchetypeVersion=2.1.0-M2 -DgroupId=cn.xue.app -DartifactId=xueAppFuse` ...

    appfuse学习笔记(二)新建模块

    在本篇“appfuse学习笔记(二)新建模块”中,我们将深入探讨AppFuse框架的模块创建过程。AppFuse是一个开源项目,它提供了一个快速开发Web应用的基础结构,旨在简化开发流程并提高代码质量。通过AppFuse,开发者...

    AppFuse学习笔记(J2EE入门级框架)

    9. **多种测试**:支持单元测试、集成测试等多种测试策略。 **快速入门步骤**: 1. 安装 JDK 5 或更高版本,Maven 2.0.4 或以上。 2. 安装 MySQL 5.x 数据库,以及本地 SMTP 邮件服务(或修改邮件配置)。 3. 选择...

    appfuse-service-3.0.0.zip

    《AppFuse Service 3.0.0与Closure Compiler Maven Plugin深度解析》 AppFuse Service 3.0.0 是一个开源项目,它提供了一个基础框架,用于快速开发企业级Java应用。这个版本的亮点在于其集成了一系列现代开发工具和...

    Appfuse1.9至2.0.2

    主要是自己从网络上搜集的一些关于appfuse1.8.2-2.0.2的一些相关资料,间或有点自己试验的记录,还有点maven和quartz的东东,之前我主要是用1.8.2构建项目,感觉还不错,希望对想学习appfuse的人有些帮助.

    appfuse学习笔记(三)解决乱码和菜单设置

    在本篇“appfuse学习笔记(三)解决乱码和菜单设置”中,我们将深入探讨在使用AppFuse框架时遇到的编码问题以及如何定制应用程序的菜单。AppFuse是一款开源项目,它提供了一个快速开发Web应用的基础,特别是对于Java...

    玩转appfuse--使用appfuse建设MVC网站

    5. **配置与测试**:配置应用的部署环境,如数据库连接信息,然后编写单元测试和集成测试,确保功能正确。 6. **部署与运行**:使用Maven打包应用,将其部署到服务器上,通过浏览器访问运行的应用。 ### 示例文档...

    appfuse1.4-architecture

    06年时的appfuse,学习SSH架构的经典入门框架。相对比较老的资料,可以欣赏一下当时的架构,向牛人致敬

    appfuse2学习日记

    ### AppFuse2 学习知识点总结 #### 一、AppFuse 概述 ... mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=...

    AppFuse学习笔记

    AppFuse 是一个开源项目,专为加速 J2EE 应用程序开发而设计。...通过本文的学习,读者将能够熟练运用 AppFuse,体验其带来的高效和便捷。同时,结合 Ant 脚本,开发者可以灵活地管理和构建项目,进一步提高开发效率。

    appfuse-demos

    appfuse-demos-2.0.2代码生成的基本代码框架。

Global site tag (gtag.js) - Google Analytics