[
https://issues.apache.org/jira/browse/WW-3826?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13284835#comment-13284835
]
Bruce Phillips commented on WW-3826:
------------------------------------
Michael - I think I figured out how to use the work-around you wrote about
above - here is my complete test class (this class tests a portlet action in
the example project I posted a link to in my original bug report).
Let me know if the below is not correct. My test does pass :) now.
package com.struts2.tutorial.action;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.portlet.ActionResponse;
import javax.portlet.PortletMode;
import org.apache.log4j.Logger;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.portlet.PortletConstants;
import org.apache.struts2.portlet.PortletPhase;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Test;
import org.springframework.mock.web.portlet.MockPortletRequest;
import org.springframework.mock.web.portlet.MockPortletSession;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionProxy;
import com.struts2.tutorial.model.Employee;
public class ListEmployeeActionTest extends StrutsTestCase {
private final static Logger LOG =
Logger.getLogger(ListEmployeeActionTest.class.getName());
MockPortletRequest portletRequest ;
ActionResponse portletResponse ;
MockPortletSession portletSession ;
Map<String,Object> session = new HashMap<String, Object>();
protected void prepareActionForTesting(final ActionProxy proxy) throws
Exception
{
final Mockery context = new Mockery();
portletRequest = new MockPortletRequest();
portletResponse = context.mock(ActionResponse.class);
context.checking(new Expectations() {
{
allowing(portletResponse).setRenderParameter(
with(any(String.class)),with(any(String.class)));
allowing(portletResponse).setPortletMode(
with(any(PortletMode.class)));
}
});
portletSession = new MockPortletSession();
portletRequest.setSession(portletSession);
final ActionContext actionContext =
proxy.getInvocation().getInvocationContext();
actionContext.setSession(session);
actionContext.put(PortletConstants.REQUEST,portletRequest);
actionContext.put(PortletConstants.RESPONSE,portletResponse);
actionContext.put(PortletConstants.MODE_NAMESPACE_MAP,new
HashMap<PortletMode, String>());
actionContext.put(PortletConstants.PHASE, PortletPhase.EVENT_PHASE);
}
@Test
public void testExecute() throws Exception {
ActionProxy proxy = getActionProxy("/view/index.action");
prepareActionForTesting(proxy);
ListEmployeeAction action = (ListEmployeeAction) proxy.getAction() ;
assertNotNull(action);
String result = proxy.execute() ;
assertEquals("Result of calling execute method of index action
is not success but it should be.", "success", result);
List<Employee> employees = action.getEmployees() ;
LOG.info("Number of employees found " + employees.size() );
assertEquals("Number of employees found is not 2 but should
be.", 2, employees.size() );
}
}
> Unit Testing A Portlet Action Using StrutsTestCase Causes A
> NullPointerException
> --------------------------------------------------------------------------------
>
> Key: WW-3826
> URL: https://issues.apache.org/jira/browse/WW-3826
> Project: Struts 2
> Issue Type: Bug
> Components: Plugin - Portlet
> Affects Versions: 2.3.4
> Environment: JUnit 4.8.2 - Struts version 2.3.4
> Reporter: Bruce Phillips
> Fix For: 2.3.5
>
>
> When running a unit test of a Struts portlet Action using StrutsTestCase the
> test causes an error -
> java.lang.NullPointerException at
> org.apache.struts2.portlet.interceptor.PortletStateInterceptor.intercept(PortletStateInterceptor.java:52)
>
> (see below for complete stack trace)
> The same test when run with Struts portlet plugin version 2.2.1 passes.
> You can download an example application here:
> http://www.brucephillips.name/struts/Struts2CRUDPortletExample_Finish.zip.
> Unzip the example. In the project's root folder run mvn -e clean test. The
> test will pass.
> Modify pom.xml in the project to set the version number of Struts to 2.3.4.
> Remove the dependency on javaassist. Save the pom.xml
> In the project's root folder run mvn -e clean test. The test will error.
> View the test report in target/surfire-reports.
> -------------------------------------------------------------------------------
> Test set: com.struts2.tutorial.action.ListEmployeeActionTest
> -------------------------------------------------------------------------------
> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.185 sec <<<
> FAILURE!
> testExecute(com.struts2.tutorial.action.ListEmployeeActionTest) Time
> elapsed: 0.998 sec <<< ERROR!
> java.lang.NullPointerException
> at
> org.apache.struts2.portlet.interceptor.PortletStateInterceptor.intercept(PortletStateInterceptor.java:52)
> at
> com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
> at
> org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
> at
> com.struts2.tutorial.action.ListEmployeeActionTest.testExecute(ListEmployeeActionTest.java:24)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:601)
> at junit.framework.TestCase.runTest(TestCase.java:168)
> at junit.framework.TestCase.runBare(TestCase.java:134)
> at junit.framework.TestResult$1.protect(TestResult.java:110)
> at junit.framework.TestResult.runProtected(TestResult.java:128)
> at junit.framework.TestResult.run(TestResult.java:113)
> at junit.framework.TestCase.run(TestCase.java:124)
> at junit.framework.TestSuite.runTest(TestSuite.java:243)
> at junit.framework.TestSuite.run(TestSuite.java:238)
> at
> org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
> at
> org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
> at
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
> at
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:601)
> at
> org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
> at
> org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
> at
> org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
> at
> org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
> at
> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira