PortletTester是针对Portlet单元测试的开源框架,遵循JSR168和JSR286规范。从https://github.com/druglee/portlettester可以下载最新的jar包。使用Maven构建项目的话可以加入依赖:
引用
groupId: com.portletguru
artifactId: portlettester
如果不使用Maven构建的话,需要在classpath中包含下列jar包:
- portlet-api-2.0.jar
- servlet-api.jar (2.4以上版本)
- ccpp-1.0.jar
- commons-lang-2.6.jar
注意:这些jar包有可能自身还需要依赖别的包,如果是这样的话请自行下载其他的依赖。
下面就让我们来看看如何使用PortletTester进行单元测试。首先,假设我们有这样一个SamplePortlet类:
public class SamplePortlet extends GenericPortlet {
public static final String INIT_PARAM_KEY = "initParamKey";
public static final String TEST_ACTION_NAME = "testAction";
public static final String PARAM_USER_ID = "paramUserId";
public static final String PREFS_PREFERRED_USER_ID = "preferredUserId";
public static final String REQUEST_ATTR_SAVED_USER_ID = "savedUserId";
private boolean isParamSet;
@Override
public void init(PortletConfig config) throws PortletException {
super.init(config);
String initParam = getInitParameter(INIT_PARAM_KEY);
isParamSet = "true".equals(initParam);
}
/**
*
*
* @param request
* @param response
* @throws IOException
* @throws PortletException
*/
@ProcessAction(name = TEST_ACTION_NAME)
public void processActionSaveUserId(ActionRequest request, ActionResponse response)
throws IOException, PortletException {
if(!isParamSet) {
throw new PortletException("Portlet not correctly initialized.");
}
String userId = request.getParameter(PARAM_USER_ID);
if(StringUtils.isNotEmpty(userId)) {
PortletPreferences preferences = request.getPreferences();
preferences.setValue(PREFS_PREFERRED_USER_ID, userId);
preferences.store();
}
response.setRenderParameter(PARAM_USER_ID, userId);
}
}
那么相应地,我们应该就会有如下这个测试类:
public class SamplePortletTest {
private static PortletTester portletTester;
private SamplePortlet portlet;
@BeforeClass
public static void setupClass() {
portletTester = new PortletTester();
}
@Before
public void setup() throws PortletException {
portlet = new SamplePortlet();
PortletConfigGenerator configGenerator = portletTester.getPortletConfigGenerator();
configGenerator.addInitParameter(SamplePortlet.INIT_PARAM_KEY, "true");
portletTester.initPortlet(portlet, configGenerator.generatePortletConfig());
}
/**
* Test processActionSaveUserId() is able to save user id to preferences and
* save it as render parameter
*
* @throws IOException
* @throws PortletException
*/
@Test
public void testProcessActionSaveUserId() throws IOException, PortletException {
String userId = "123";
ActionRequestGenerator requestGenerator = portletTester.getActionRequestGenerator();
ActionResponseGenerator responseGenerator = portletTester.getActionResponseGenerator();
requestGenerator.setParameter(SamplePortlet.PARAM_USER_ID, userId);
ActionRequest request = requestGenerator.generateRequest();
ActionResponse response = responseGenerator.generateResponse();
portlet.processActionSaveUserId(request, response);
/* verify results */
PortletPreferences preferences = request.getPreferences();
assertEquals(userId, preferences.getValue(SamplePortlet.PREFS_PREFERRED_USER_ID, ""));
Map<String, String[]> params = response.getRenderParameterMap();
assertEquals(userId, params.get(SamplePortlet.PARAM_USER_ID)[0]);
}
@After
public void tearDown() {
portletTester.reset();
}
@AfterClass
public static void tearDownClass() {
portletTester = null;
}
}
接下来我们一步步地通过分析这个测试类来看看如何使用PortletTester。
public static void setupClass() {
portletTester = new PortletTester();
}
首先,我们在setupClass()中创建了一个PortletTester的实例,这个实例可以在这个测试类的整个测试过程中重复利用,因此每个测试类只需要创建一个就行了。
接着,我们在setup()方法中初始化了需要测试的SamplePortlet实例。从SamplePortlet类的init()方法中可以看出,初始化这个类的实例需要一个键为initParamKey,值为true的init-parameter。熟悉Portlet开发的读者都会知道这种参数定义在portlet.xml文件的<init-param>标签里。
由于初始化的需要,我们需要创建一个PortletConfig对象,并把所需的init-parameter放入其中。要创建这样一个对象,我们需要调用PortletTester#getPortletConfigGenerator()方法来获得其对应的生成器。通过这个生成器,我们可以添加任何可以出现在PortletConfig中的内容,例如init-parameter,publishingEvent, processingEvent等等。如下所示,我们通过生成器添加了一个init-parameter。
PortletConfigGenerator configGenerator = portletTester.getPortletConfigGenerator();
configGenerator.addInitParameter(SamplePortlet.INIT_PARAM_KEY, "true");
当添加完所有需要的内容后,只需要调用PortletConfigGenerator#generatePortletConfig()就可以获得PortletConfig的实例了。有了这个对象,我们就能利用Portlet的init()方法对其初始化了。
portletTester.initPortlet(portlet, configGenerator.generatePortletConfig());
完成了setup()以后,我们再来看测试方法的部份。我们可以看到,需要测试的方法是一个ProcessAction的方法,因此,基本条件是要获得一组ActionRequest和ActionResponse,根据我们前面的经验,我们通过调用PortletTester中相应的方法先获得它们的生成器,填充好内容以后就能获得需要的对象了。
ActionRequestGenerator requestGenerator = portletTester.getActionRequestGenerator();
ActionResponseGenerator responseGenerator = portletTester.getActionResponseGenerator();
requestGenerator.setParameter(SamplePortlet.PARAM_USER_ID, userId);
ActionRequest request = requestGenerator.generateRequest();
ActionResponse response = responseGenerator.generateResponse();
最后,只要在tearDown()也就是每个测试方法执行的最后调用PortletTester#reset()就能让它恢复到初始状态。
分享到:
相关推荐
Portlet是一种在Web应用程序中,特别是...在实际项目中,我们可以利用过滤器和拦截器对portlet的行为进行细粒度控制,提高系统的安全性和性能。同时,深入理解portlet的类结构也有助于定制化开发和优化portlet功能。
总的来说,Portlet标准汉化手册旨在为开发者提供关于如何构建和使用Portal Server及Portlet的详细指南,帮助他们理解这一技术的精髓,以便在实际项目中有效利用Portal架构的优势,提供更加个性化和高效的服务。
5. 测试和调试:在开发环境中部署portlet,通过门户服务器的管理界面添加portlet到门户页面,进行功能测试和界面调整。 6. 打包和部署:将portlet打包成WAR文件,上传到portal服务器进行正式部署。 五、学习资源 ...
WebSphere是IBM提供的一个企业级门户解决方案,而Apache Pluto是Jakarta Portal的参考实现,二者都提供了一个良好的环境供开发和测试Portlet应用。 ### Portlet独有概念 Portlet有很多独有概念,如Portlet URL,...
在portlet的生命周期中,初始化阶段是portlet被加载时进行的,这通常包括portlet配置的读取和资源的初始化。渲染阶段是portlet显示内容的时刻,它会根据请求参数和portlet状态生成HTML输出。事件处理则允许portlet...
综上所述,jQuery Portlet 是一种利用jQuery UI和MVC设计模式构建的可定制Web组件,其特性包括拖放、布局管理和智能添加等,旨在提供灵活、用户友好的Web界面。通过深入理解这些概念和技术,开发者可以构建出更加...
2. **portlet配置**:portlet可以通过portlet.xml文件进行配置,其中包含了portlet的元数据,如标题、描述、参数设置等。 3. **渲染上下文**:PortletRenderContext对象在渲染阶段传递,包含了portlet渲染所需的上...
Portlet是一种Web应用程序组件,主要用于构建企业级的门户系统。Portlet规范定义了这些组件如何在门户环境中交互、渲染...通过学习Portlet规范,开发者能够更好地利用portlet技术,打造满足用户需求的、高效的Web应用。
使用单元测试框架,如JUnit,可以确保天气预报Portlet在不同的输入条件下都能正常工作。此外,持续集成工具,如Maven或Gradle,可能被用来自动化构建过程,包括编译、测试、打包和部署。 总的来说,"Portlet天气...
部署后,访问门户服务器,找到你的portlet并进行测试。检查portlet是否能正确显示和响应用户的操作。 在标签“model”中,可能涉及的是portlet的数据模型。在portlet中,你可能需要创建一个模型类来处理数据,这...
通过学习,你可以掌握如何利用这些API创建功能强大的portlet,以满足企业级应用的需求。 首先,我们需要了解portlet的基本概念。portlet有三种主要的生命周期阶段:初始化、渲染和服务。初始化阶段是portlet加载时...
5. **测试与调试**:完成上述步骤后,启动Stringbeans服务器,访问门户页面检查portlet是否正确加载和显示。如果遇到问题,可以查看服务器日志进行调试。 在提供的“门户加载外部portlet整理”压缩包中,应该包含了...
部署完成后,你可以在portal页面上添加并测试portlet。 在实际开发过程中,可能还需要处理portlet间的通信(例如,使用`PortletSession`和`PortletPreferences`),以及与后端服务的集成。你可能会用到Spring的AOP...
在这个demo中,我们将会深入探讨如何利用Spring 3.0 MVC架构来开发portlet应用。 **Spring MVC简介** Spring MVC是Spring框架的一部分,它提供了一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。Spring MVC...
10. **调试与测试**:如何进行portlet的调试,以及测试portlet功能的技巧和工具。 通过这份资料,开发者可以全面了解portlet的开发流程,提高在JeeCMS或其他Java Portal平台上的工作效率。对于希望在企业级Web应用...
3. **Portlet配置**:portlet可以通过portlet.xml文件进行配置,定义portlet的元数据,如portlet名称、标题、描述、支持的portlet模式等。 4. **portlet上下文**:提供portlet访问其环境信息,如请求、响应对象、...
10. **测试和部署**:最后,开发者需要对portlet进行功能测试和性能测试,并将其部署到门户服务器上供用户使用。 综上所述,构建一个基于JSR168的workflow portlet需要对portlet生命周期、MVC模式、工作流引擎、...
6. **测试和优化**:在门户环境中测试portlet功能,根据反馈进行调整优化。 四、portlet的优势与应用场景 JSR168 portlet的主要优势在于可复用性和灵活性,它可以整合来自不同源的数据和服务,提供个性化的用户体验...
4. 事件处理:portlet之间可以通过事件进行通信,使用`processEvent`方法接收和处理事件。 部署与测试: 1. 编译并打包portlet为WAR文件,将其部署到JetSpeed服务器的应用目录下。 2. 在JetSpeed管理界面注册...
PortletTester是一个专为portlet开发人员设计的单元测试框架,它遵循JSR168(portlet 1.0)和JSR286(portlet 2.0)标准。Portlets是Web应用程序的一种组件化形式,常用于企业级应用,如内容管理系统或协作平台。...