不好意思,最近由于在赶项目所以这篇文章今天才有时间写出来
首先讲讲taglib的使用目的,只有明确的使用目的我们才能写出明确的单元测试
通常我们自定义的taglib都是为了根据一些参数达到我们需要view层样式,在我的项目中一般比较少的使用自定义标签的body形式(body一般是为了通过标签达到框架级的页面结构),因此,对于一个taglib来说它一般要做事情有:
1、获取参数
2、根据参数获取结果集(通常这个主要是bl层的任务)
3、根据结果集得到输出样式(得到的样式一般都是一个html或者wml的字符串)
4、把得到的输出样式最终输出到页面上
根据上面的分析其实我们可以看出我们需要把测试的焦点集中在3上,因为其它的任务主要是通过调用其它封装好的方法来实现的。
用一个实例来介绍一下我的做法吧:ShowCatalogTag,主要是根据传递的类别id,显示相关的类别信息和子类信息。
根据需求我们不难看出这个标签的主要功能是
1、获取类别ID和相关样式显示参数
2、根据类别id获取类别相关信息和子类别信息
3、根据类别信息结果集和显示参数得到输出wml代码
4、把类别样式最终输出到页面上
根据需求分析我们可以设计出我们标签的主要方法有:
getOutWml()的到最终的wml输出
getCatalogLayout(List catalogList)根据类别结果集得到类别样式
然后,根据上述设计,我们可以首先写我们的单元测试了
单元测试一般是从最底层的实现方法开始写起,所以我们首先写testGetCatalogLayout
1public void testGetCatalogLayout() throws Exception {
4 List catalogList=new ArrayList();
5 CsCatalog testcatalog=new CsCatalog();
6 testcatalog.setCatalogName("ring");
7 testcatalog.setId(23l);
8 catalogList.add(testcatalog);
9 //得到待测方法结果
12 StringBuffer result = sct.getCatalogLayout(catalogList);
13 logger.debug(result);
14 //设置期望结果
15 StringBuffer outPut = new StringBuffer();
16 if (null != catalogList && catalogList.size() != 0) {
17 CsCatalog catalog = (CsCatalog) catalogList.get(0);
18 Map parameterMap = new LinkedMap();
19 for (int i = 1; i < catalogList.size() - 1; i++) {
20
21 catalog = (CsCatalog) catalogList.get(i);
22 parameterMap = new LinkedMap();
23 parameterMap.put("catalogid", Long.toString(catalog.getId()));
24 outPut.append(catalog.getCatalogName());
25 }
26 }
27 //进行断言判断期望和实际结果
28 assertEquals(outPut.toString(),result.toString());
29 }
此时,有关getCatalogLayout的测试方法已经写完了,但是实际上这个方法我们还没有写呢。所以在eclipse中会显示错误我们使用eclipse的自动完成功能来在标签中实现一个空getCatalogLayout方法,下面我将写getCatalogLayout方法的实现 :
public StringBuffer getCatalogLayout(List catalogList) {
StringBuffer outPut = new StringBuffer();
if (null != catalogList && catalogList.size() != 0) {
CsCatalog catalog = (CsCatalog) catalogList.get(0);
Map parameterMap = new LinkedMap();
for (int i = 1; i < catalogList.size() - 1; i++) {
catalog = (CsCatalog) catalogList.get(i);
parameterMap = new LinkedMap();
parameterMap.put("catalogid", Long.toString(catalog.getId()));
outPut.append(catalog.getCatalogName());
}
}
return outPut;
}
然后运行eclipse的run->junit test,ok,我们期待的绿条来了,如果要是红条,那么你就需要仔细检查一下你的方法实现代码了:)
上面的方法其实主要是说了一下如何用tdd的方式来思考和编写代码,其实getCatalogLayout这个方法基本上是和标签环境隔离的,需要传递的参数只有已知的cataloglist
下面将介绍一下在标签中使用到相关环境时的解决方案
在标签中我们一般需要使用的外部环境参数主要就是pageContext,而在pageContext中有我们需要的request,webapplicationcontext,response等等环境变量。
因此要进行完整的标签单元测试就必须要考虑到把加入相关的环境变量
首先考虑加载spring的WebApplicationContext,前一篇文章讲DAO单元测试的时候我提到过用springmock来加载spring的上下文,但是springmock加载的是ClassPathApplicationContext,两者是不一样的,而我查找了资料后没有找到相关的转换方法,结果我只有通过配置文件的路径得到WebApplicationContext,下面是一个工具类用于对spring的相关信息进行加载
/** *//**
* $Id:$
*
* Copyright 2005 easou, Inc. All Rights Reserved.
*/
package test.spring.common;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.mock.web.MockPageContext;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import test.PathConfig;
import com.easou.commons.web.taglib.BaseTag;
public class SpringTestUtil {
/** *//**
* @author rocket 初始化tag所需的MockServletContext
*
*/
protected static MockServletContext getSpringMockSC() {
MockServletContext mockServletContext = new MockServletContext();
mockServletContext.addInitParameter(
ContextLoader.CONFIG_LOCATION_PARAM, PathConfig
.getStringXmlPath(PathConfig.springxml));
ServletContextListener listener = new ContextLoaderListener();
ServletContextEvent event = new ServletContextEvent(mockServletContext);
listener.contextInitialized(event);
return mockServletContext;
}
/** *//**
* @author rocket 针对tag设置Spring的上下文
* @param tag
*/
public static void setSpringContextInTag(BaseTag tag) {
MockPageContext mockPC = new MockPageContext(getSpringMockSC());
tag.setPageContext(mockPC);
}
/** *//**
* @author rocket 获得spring的上下文
* @return spring的上下文
*/
public static WebApplicationContext getSpringContext() {
MockServletContext mockServletContext = getSpringMockSC();
return (WebApplicationContext) mockServletContext
.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}
/** *//**
* @author rocket 对servletContext设置spring的上下文
* @param servletContext
*/
public static void setSpringContext(ServletContext servletContext) {
servletContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
getSpringContext());
}
}
这个类中的几个方法可以对mock的pagecontext或者servletcontext加载spring的上下文
这里简单介绍一下我使用的环境模拟工具:
我没有使用流行的mockObject和MockRunner,主要是因为我的项目基本框架是spring+Struts,而对这两个框架的模拟有更有针对性地springmock和strutstestcase,这样在我需要加载struts相关配置信息时,strutstestcase提供了更好的支持。
比如我这里需要使用到strust中配置好的properties信息,那么下面各测试基类就基本实现的我的要求
/** *//**
* $Id:$
*
* Copyright 2005 easou, Inc. All Rights Reserved.
*/
package test.struts.common;
import org.springframework.mock.web.MockPageContext;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.web.context.WebApplicationContext;
import servletunit.struts.MockStrutsTestCase;
import test.spring.common.SpringTestUtil;
import com.easou.commons.web.taglib.BaseTag;
public class BaseStrutsTestCase extends MockStrutsTestCase {
/** *//** The transaction manager to use */
protected PlatformTransactionManager transactionManager;
/** *//**
* TransactionStatus for this test. Typical subclasses won't need to use it.
*/
protected TransactionStatus transactionStatus;
/** *//**
* @author rocket 设施struts配置文件的路径
*
*/
protected void setUp() throws Exception {
super.setUp();
分享到:
相关推荐
4. 示例代码和测试程序:演示如何使用Taglib API,以及确保库功能正常工作的单元测试。 5. 文档:可能包含API参考、教程和用户指南,帮助开发者理解和使用Taglib。 6. 许可证文件:阐述Taglib的开源许可条款,通常是...
【JSP单元测试题JNDI -JAVA Naming and Directory interface】 JNDI(JAVA Naming and Directory interface)是Java平台提供的一套接口和API,用于访问各种命名和目录服务,如DNS、LDAP等。通过JNDI,开发者可以...
这个压缩包包含了SSM开发所需的一些关键组件,以及单元测试和JSON处理工具,下面将详细阐述这些组件的作用和相关知识点。 1. **Spring**:Spring是一个开源的Java平台,核心功能是依赖注入(Dependency Injection,...
1. **单元测试**:对JSTL标签的功能进行独立验证,例如,测试`<c:if>`是否正确执行条件判断,`<c:forEach>`是否能正确遍历集合。 2. **集成测试**:检查JSTL标签在实际应用中的交互和协作,比如在处理表单提交或用户...
1. **单元测试**:对于JSP中的Java代码,可以使用JUnit等工具进行单元测试,确保代码逻辑正确。 2. **功能测试**:通过浏览器访问JSP页面,检查输出结果是否符合预期,验证页面的动态功能。 3. **性能测试**:利用...
Java提供了多种测试框架,如JUnit,它是一个用于编写单元测试的开源库。开发者可以创建测试类来验证单个方法或小块代码的功能。JUnit支持注解,如@Test,可以方便地标记测试方法,并提供断言机制来判断测试结果是否...
简洁,快速的验证语法 无需编写验证提示信息(当然也支持自定义提示信息) ...易于其它标准的jsp taglib集成 特殊应用场景支持,如:密码确认,结束日期必须大于开始日期 完整详细的单元测试,保证框架质量
Spring框架包含了丰富的测试支持,如单元测试、集成测试工具,使得开发者可以方便地编写和执行测试用例,确保代码质量。 10. **版本升级** Spring框架定期发布新版本,以修复已知问题、添加新功能和改进性能。...
·用mock objects进行隔离测试(★★★★★) ... ·对如下内容进行单元测试 ◆Java应用程序(★★) ◆Filter ◆Servlet (★★★★) ◆EJB ◆JSP (★★★) ◆数据库应用程序(★★) ◆Taglib
11. **单元测试和集成测试**:JUnit是Java中的单元测试框架,可能用于测试各个组件的正确性;而像Selenium这样的工具可能会用于模拟用户行为的集成测试。 通过这个项目,学生不仅可以提升Java和JSP的编程技能,还能...
3. **测试难度**:由于Action与Web层紧密耦合,单元测试变得困难。尽管有Struts TestCase工具,但完整的单元测试依然是一项挑战。 4. **类型转换**:Struts的FormBean默认将所有数据视为String类型,需要通过Apache...
3. **测试覆盖**:升级后进行全面的单元测试和集成测试,确保功能正常。 ### 样例部署 部署E3.Tree样例通常包括以下步骤: 1. **获取样例代码**:从官方仓库下载或克隆样例项目。 2. **配置依赖**:在项目的pom.xml...
在Servlet依赖上,Struts1的Action直接依赖于Servlet API,这意味着Action的execute方法接收HttpServletRequest和HttpServletResponse参数,这不利于单元测试。而Struts2 Action不再直接依赖于容器,可以独立测试,...
7. **测试**:为了确保功能的正确性,源码可能还包括单元测试和集成测试,对各种情况下的标签读取和写入进行验证。 通过分析这个项目,开发者可以学习到如何在Android环境中使用第三方库进行文件操作,以及如何通过...
3. **单元测试难度**:Struts的Action类与Web容器紧密耦合,导致直接对其进行单元测试较为困难。虽然可以通过StrutsTestCase等工具进行辅助测试,但依然不如完全解耦的设计方便。 4. **类型转换限制**:Struts的...
6. **test**:这是一个测试目录,可能包含了单元测试或集成测试代码,使用JUnit或其他测试框架对J2EE组件进行验证,确保代码质量。 7. **ejbtest**:EJB(Enterprise JavaBeans)是J2EE中的核心组件,用于构建可...
3. **测试难度**:由于Action与Web层紧密耦合,单元测试较为困难,虽然有Struts TestCase工具,但依然不如独立的单元测试来得便捷。 4. **类型转换问题**:Struts的FormBean默认将所有数据存储为String类型,需要...
10. 测试与部署:对于这样一个系统,单元测试和集成测试是必不可少的,JUnit和Mockito等工具可以辅助测试。部署时,可能涉及Tomcat、Jetty等应用服务器。 总的来说,"基于Struts的企业内部网信息管理系统"是一个...
最后,开发过程中的一些工具和实践,比如Maven或Gradle构建工具,Git版本控制,IntelliJ IDEA或Eclipse IDE的使用,以及单元测试和集成测试的策略,都是提高效率和保证代码质量的关键。 总的来说,"java小记.rar"这...
- 提供了全面的测试框架,包括单元测试、集成测试和功能测试。 - 可以使用 Spock 测试框架编写行为驱动的测试用例。 11. **Grails 部署** - Grails 应用可以打包为 WAR 文件部署到 Tomcat 或其他 Servlet 容器。...