利用PortletTester进行Portlet单元测试
程序员文章站
2022-04-07 12:09:17
...
PortletTester是针对Portlet单元测试的开源框架,遵循JSR168和JSR286规范。从https://github.com/druglee/portlettester可以下载最新的jar包。使用Maven构建项目的话可以加入依赖:
如果不使用Maven构建的话,需要在classpath中包含下列jar包:
注意:这些jar包有可能自身还需要依赖别的包,如果是这样的话请自行下载其他的依赖。
下面就让我们来看看如何使用PortletTester进行单元测试。首先,假设我们有这样一个SamplePortlet类:
那么相应地,我们应该就会有如下这个测试类:
接下来我们一步步地通过分析这个测试类来看看如何使用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#generatePortletConfig()就可以获得PortletConfig的实例了。有了这个对象,我们就能利用Portlet的init()方法对其初始化了。
完成了setup()以后,我们再来看测试方法的部份。我们可以看到,需要测试的方法是一个ProcessAction的方法,因此,基本条件是要获得一组ActionRequest和ActionResponse,根据我们前面的经验,我们通过调用PortletTester中相应的方法先获得它们的生成器,填充好内容以后就能获得需要的对象了。
最后,只要在tearDown()也就是每个测试方法执行的最后调用PortletTester#reset()就能让它恢复到初始状态。
引用
groupId: com.portletguru
artifactId: portlettester
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()就能让它恢复到初始状态。