Struts2.3.12 junit4 testcase请求和会话为空

我已经完成了这个解决方案: Struts 2 JUnit Plugin v2.2.3:Test Class Extending StrutsTestCase; ‘request’为空

但是我已经没有struts2-spring插件了,我也没有在我的应用程序中使用spring。

我有3个测试用例,2个请求失败,为null,一个失败,会话为null

第一个Stacktrace

java.lang.NullPointerException at org.apache.struts2.interceptor.MessageStoreInterceptor.before(MessageStoreInterceptor.java:228) at org.apache.struts2.interceptor.MessageStoreInterceptor.intercept(MessageStoreInterceptor.java:193) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) at actions.TestIoOptimizationAction.login(TestIoOptimizationAction.java:29) 

对应于

  Collection actionErrors = (Collection) session.get(actionErrorsSessionKey); 

第二和第三测试堆栈跟踪

 java.lang.NullPointerException at org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69) at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185) at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63) at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39) at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) at org.apache.struts2.StrutsJUnit4TestCase.getActionProxy(StrutsJUnit4TestCase.java:149) 

对应于

  String contextPath = ServletActionContext.getRequest().getContextPath(); 

我相信存在一些依赖性问题。 我尝试逐个删除一些依赖项并组合使用,但都没有工作。

这是我的POM的样子:

   javax.servlet jsp-api 2.0 test   com.paypal.sdk rest-api-sdk 0.7.1   net.sourceforge.htmlunit htmlunit 2.12 compile   org.apache.commons commons-lang3 3.0 jar compile   commons-beanutils commons-beanutils-core 1.8.3   javax.mail mail 1.4.5   commons-lang commons-lang 2.4   javax.persistence persistence-api 1.0 jar compile   mysql mysql-connector-java 5.1.6   org.hibernate hibernate-entitymanager ${hibernate.version}   org.hibernate hibernate-validator 4.0.0.GA   org.hibernate hibernate-c3p0 ${hibernate.version}   org.slf4j slf4j-log4j12 1.6.1   org.apache.tiles tiles-servlet 2.1.4   org.apache.tiles tiles-jsp 2.1.4   org.apache.struts struts2-core ${struts.version}   org.apache.struts struts2-json-plugin ${struts.version}   org.apache.struts struts2-tiles-plugin ${struts.version}   org.apache.struts struts2-junit-plugin ${struts.version}   joda-time joda-time 2.1   org.quartz-scheduler quartz 1.7.3  <!--  junit junit 4.11 test -->  commons-collections commons-collections 3.2.1 jar   org.jboss.spec jboss-javaee-6.0 1.0.0.Final pom provided   org.apache.myfaces.core myfaces-api 2.1.11   net.sf.jasperreports jasperreports 3.7.5   com.google.code.gson gson 2.2.4   xml-apis xml-apis 1.4.01    2.3.12 3.6.10.Final 3.5.1 all Tomcat  

更新 – 测试看起来像

 @Test public void login() throws Exception { request.setParameter("email", "nitin.cool4urchat@gmail.com"); request.setParameter("password", "22"); ActionProxy proxy = getActionProxy("login"); String result = proxy.execute(); assertEquals("success", result); System.out.println(response.getContentAsString()); } @Test public void testView() throws Exception { ActionProxy proxy = getActionProxy("/optimize/view"); String result = proxy.execute(); assertEquals("success", result); System.out.println(response.getContentAsString()); proxy = getActionProxy("/optimize/view/23"); result = proxy.execute(); assertEquals("success", result); System.out.println(response.getContentAsString()); proxy = getActionProxy("/optimize/view/110"); result = proxy.execute(); assertEquals("success", result); System.out.println(response.getContentAsString()); } @Test public void testSave() throws Exception { request.setContent("{\"id\":\"1\",\"name\":\"nitin\"}".getBytes()); request.addHeader("Content-Type", "application/json"); request.setMethod("POST"); ActionProxy proxy = getActionProxy("/save"); actions.IoOptimizationAction myAct = (actions.IoOptimizationAction) proxy.getAction(); String result = proxy.execute(); assertEquals("success", result); System.out.println(response.getContentAsString()); } 

更新我按照建议将测试更改为executeAction,因此,第二个测试现在看起来像

  @Test public void testView() throws Exception { System.out.println(ActionContext.getContext()); System.out.println(executeAction("optimize/view")); } 

错误堆栈跟踪是:

 [2013-10-29 14:50:38.766] [ WARN] MockServletContext.getRealPath:298 - Couldn't determine real path of resource class path resource [org/apache/struts2/dispatcher/error_en_US.ftl] java.io.FileNotFoundException: class path resource [org/apache/struts2/dispatcher/error_en_US.ftl] cannot be resolved to URL because it does not exist at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:179) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:48) at org.springframework.mock.web.MockServletContext.getRealPath(MockServletContext.java:295) at freemarker.cache.WebappTemplateLoader.findTemplateSource(WebappTemplateLoader.java:129) at freemarker.cache.MultiTemplateLoader.findTemplateSource(MultiTemplateLoader.java:111) at freemarker.cache.TemplateCache.acquireTemplateSource(TemplateCache.java:646) at freemarker.cache.TemplateCache.findTemplateSource(TemplateCache.java:622) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:346) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:235) at freemarker.template.Configuration.getTemplate(Configuration.java:578) at freemarker.template.Configuration.getTemplate(Configuration.java:543) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:841) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:569) at org.apache.struts2.StrutsJUnit4TestCase.executeAction(StrutsJUnit4TestCase.java:128) at actions.TestIoOptimizationAction.testView(TestIoOptimizationAction.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911) [2013-10-29 14:50:38.810] [ WARN] MockServletContext.getRealPath:298 - Couldn't determine real path of resource class path resource [org/apache/struts2/dispatcher/error_en.ftl] java.io.FileNotFoundException: class path resource [org/apache/struts2/dispatcher/error_en.ftl] cannot be resolved to URL because it does not exist at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:179) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:48) at org.springframework.mock.web.MockServletContext.getRealPath(MockServletContext.java:295) at freemarker.cache.WebappTemplateLoader.findTemplateSource(WebappTemplateLoader.java:129) at freemarker.cache.MultiTemplateLoader.findTemplateSource(MultiTemplateLoader.java:111) at freemarker.cache.TemplateCache.acquireTemplateSource(TemplateCache.java:646) at freemarker.cache.TemplateCache.findTemplateSource(TemplateCache.java:622) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:346) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:235) at freemarker.template.Configuration.getTemplate(Configuration.java:578) at freemarker.template.Configuration.getTemplate(Configuration.java:543) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:841) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:569) at org.apache.struts2.StrutsJUnit4TestCase.executeAction(StrutsJUnit4TestCase.java:128) at actions.TestIoOptimizationAction.testView(TestIoOptimizationAction.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911) [2013-10-29 14:50:39.127] [ WARN] MockServletContext.getRealPath:298 - Couldn't determine real path of resource class path resource [org/apache/struts2/dispatcher/error.ftl] java.io.FileNotFoundException: class path resource [org/apache/struts2/dispatcher/error.ftl] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/C:/Users/hp/.m2/repository/org/apache/struts/struts2-core/2.3.12/struts2-core-2.3.12.jar!/org/apache/struts2/dispatcher/error.ftl at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:204) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) at org.springframework.mock.web.MockServletContext.getRealPath(MockServletContext.java:295) at freemarker.cache.WebappTemplateLoader.findTemplateSource(WebappTemplateLoader.java:129) at freemarker.cache.MultiTemplateLoader.findTemplateSource(MultiTemplateLoader.java:111) at freemarker.cache.TemplateCache.acquireTemplateSource(TemplateCache.java:646) at freemarker.cache.TemplateCache.findTemplateSource(TemplateCache.java:622) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:346) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:235) at freemarker.template.Configuration.getTemplate(Configuration.java:578) at freemarker.template.Configuration.getTemplate(Configuration.java:543) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:841) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:569) at org.apache.struts2.StrutsJUnit4TestCase.executeAction(StrutsJUnit4TestCase.java:128) at actions.TestIoOptimizationAction.testView(TestIoOptimizationAction.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911)   Struts Problem Report  pre { margin: 0; padding: 0; }    

Struts Problem Report

Struts has detected an unhandled exception:

Messages:
File: org/apache/struts2/impl/StrutsActionProxy.java
Line number: 69

Stacktraces

java.lang.NullPointerException
 org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69) com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185) org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63) org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39) com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:536) org.apache.struts2.StrutsJUnit4TestCase.executeAction(StrutsJUnit4TestCase.java:128) actions.TestIoOptimizationAction.testView(TestIoOptimizationAction.java:44) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) org.junit.runners.ParentRunner.run(ParentRunner.java:236) junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520) org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060) org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911) 

如果使用getActionProxy方法执行操作,则需要将新会话映射设置为调用上下文。

 ActionProxy actionProxy = getActionProxy("/action"); Map sessionMap = new HashMap(); actionProxy.getInvocation().getInvocationContext().setSession(sessionMap); actionProxy.execute(); 

如果您不需要引用动作代理,则可以使用executeAction方法。 请注意, executeAction将返回结果的实际输出,而不是execute方法返回的结果。

为避免request为null:

 request = new MockHttpServletRequest(); 

对于会议:

 Map sessionMap = new HashMap(); actionProxy.getInvocation().getInvocationContext().setSession(sessionMap); 

在我的情况下,我需要从我的测试中调用super.setUp