Author: mcucchiara Date: Thu Aug 4 15:12:44 2011 New Revision: 1153904 URL: http://svn.apache.org/viewvc?rev=1153904&view=rev Log: WW-3667 - StrutsJUnit4TestCase does not provide the executeAction method
Added: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringJUnit4TestCase.java (with props) Modified: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java (contents, props changed) struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringTestCase.java (props changed) struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java (contents, props changed) Modified: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java?rev=1153904&r1=1153903&r2=1153904&view=diff ============================================================================== --- struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java (original) +++ struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java Thu Aug 4 15:12:44 2011 @@ -1,16 +1,49 @@ +/* + * $Id$ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.struts2; -import com.opensymphony.xwork2.XWorkJUnit4TestCase; +import com.opensymphony.xwork2.*; +import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.interceptor.annotations.After; import com.opensymphony.xwork2.interceptor.annotations.Before; import com.opensymphony.xwork2.util.logging.LoggerFactory; import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory; import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.mapper.ActionMapper; +import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.apache.struts2.util.StrutsTestCaseHelper; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockPageContext; import org.springframework.mock.web.MockServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.Map; import java.util.logging.ConsoleHandler; import java.util.logging.Formatter; @@ -18,8 +51,17 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; +import static org.junit.Assert.assertNotNull; + + +public class StrutsJUnit4TestCase<T> extends XWorkJUnit4TestCase { + protected MockHttpServletResponse response; + protected MockHttpServletRequest request; + protected MockPageContext pageContext; + protected MockServletContext servletContext; + protected Map<String, String> dispatcherInitParams; -public class StrutsJUnit4TestCase extends XWorkJUnit4TestCase { + protected DefaultResourceLoader resourceLoader = new DefaultResourceLoader(); static { ConsoleHandler handler = new ConsoleHandler(); @@ -51,6 +93,115 @@ public class StrutsJUnit4TestCase extend } /** + * gets an object from the stack after an action is executed + */ + protected Object findValueAfterExecute(String key) { + return ServletActionContext.getValueStack(request).findValue(key); + } + + /** + * gets an object from the stack after an action is executed + * @return The executed action + */ + @SuppressWarnings("unchecked") + protected T getAction() { + return (T) findValueAfterExecute("action"); + } + + protected boolean containsErrors() { + T action = this.getAction(); + if(action instanceof ValidationAware) { + return ((ValidationAware) action).hasActionErrors(); + } + throw new UnsupportedOperationException("Current action does not implement ValidationAware interface"); + } + + /** + * Executes an action and returns it's output (not the result returned from + * execute()), but the actual output that would be written to the response. + * For this to work the configured result for the action needs to be + * FreeMarker, or Velocity (JSPs can be used with the Embedded JSP plugin) + */ + protected String executeAction(String uri) throws ServletException, UnsupportedEncodingException { + request.setRequestURI(uri); + ActionMapping mapping = getActionMapping(request); + + assertNotNull(mapping); + Dispatcher.getInstance().serviceAction(request, response, servletContext, mapping); + + if (response.getStatus() != HttpServletResponse.SC_OK) + throw new ServletException("Error code [" + response.getStatus() + "], Error: [" + + response.getErrorMessage() + "]"); + + return response.getContentAsString(); + } + + /** + * Creates an action proxy for a request, and sets parameters of the ActionInvocation to the passed + * parameters. Make sure to set the request parameters in the protected "request" object before calling this method. + */ + protected ActionProxy getActionProxy(String uri) { + request.setRequestURI(uri); + ActionMapping mapping = getActionMapping(request); + String namespace = mapping.getNamespace(); + String name = mapping.getName(); + String method = mapping.getMethod(); + + Configuration config = configurationManager.getConfiguration(); + ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy( + namespace, name, method, new HashMap<String, Object>(), true, false); + + ActionContext invocationContext = proxy.getInvocation().getInvocationContext(); + invocationContext.setParameters(new HashMap(request.getParameterMap())); + // set the action context to the one used by the proxy + ActionContext.setContext(invocationContext); + + // this is normaly done in onSetUp(), but we are using Struts internal + // objects (proxy and action invocation) + // so we have to hack around so it works + ServletActionContext.setServletContext(servletContext); + ServletActionContext.setRequest(request); + ServletActionContext.setResponse(response); + + return proxy; + } + + /** + * Finds an ActionMapping for a given request + */ + protected ActionMapping getActionMapping(HttpServletRequest request) { + return Dispatcher.getInstance().getContainer().getInstance(ActionMapper.class).getMapping(request, + Dispatcher.getInstance().getConfigurationManager()); + } + + /** + * Finds an ActionMapping for a given url + */ + protected ActionMapping getActionMapping(String url) { + MockHttpServletRequest req = new MockHttpServletRequest(); + req.setRequestURI(url); + return getActionMapping(req); + } + + /** + * Injects dependencies on an Object using Struts internal IoC container + */ + protected void injectStrutsDependencies(Object object) { + Dispatcher.getInstance().getContainer().inject(object); + } + + + protected void setupBeforeInitDispatcher() throws Exception { + } + + protected void initServletMockObjects() { + servletContext = new MockServletContext(resourceLoader); + response = new MockHttpServletResponse(); + request = new MockHttpServletRequest(); + pageContext = new MockPageContext(servletContext, request, response); + } + + /** * Sets up the configuration settings, XWork configuration, and * message resources */ @@ -58,12 +209,13 @@ public class StrutsJUnit4TestCase extend public void setUp() throws Exception { super.setUp(); - initDispatcher(null); - + initServletMockObjects(); + setupBeforeInitDispatcher(); + initDispatcher(dispatcherInitParams); } protected Dispatcher initDispatcher(Map<String, String> params) { - Dispatcher du = StrutsTestCaseHelper.initDispatcher(new MockServletContext(), params); + Dispatcher du = StrutsTestCaseHelper.initDispatcher(servletContext, params); configurationManager = du.getConfigurationManager(); configuration = configurationManager.getConfiguration(); container = configuration.getContainer(); Propchange: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsJUnit4TestCase.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Added: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringJUnit4TestCase.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringJUnit4TestCase.java?rev=1153904&view=auto ============================================================================== --- struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringJUnit4TestCase.java (added) +++ struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringJUnit4TestCase.java Thu Aug 4 15:12:44 2011 @@ -0,0 +1,45 @@ +/* + * $Id$ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.struts2; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.web.context.WebApplicationContext; + +/** + * User: mcucchiara + * Date: 04/08/11 + * Time: 16.50 + */ +public class StrutsSpringJUnit4TestCase<T> extends StrutsJUnit4TestCase<T> implements ApplicationContextAware { + protected ApplicationContext applicationContext; + + @Override + protected void setupBeforeInitDispatcher() throws Exception { + this.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); + } + + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } +} Propchange: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringJUnit4TestCase.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsSpringTestCase.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Modified: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java?rev=1153904&r1=1153903&r2=1153904&view=diff ============================================================================== --- struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java (original) +++ struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java Thu Aug 4 15:12:44 2011 @@ -21,21 +21,13 @@ package org.apache.struts2; -import java.io.UnsupportedEncodingException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.ConsoleHandler; -import java.util.logging.Formatter; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.ActionProxyFactory; +import com.opensymphony.xwork2.XWorkTestCase; +import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory; import org.apache.struts2.dispatcher.Dispatcher; import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.mapper.ActionMapping; @@ -46,13 +38,15 @@ import org.springframework.mock.web.Mock import org.springframework.mock.web.MockPageContext; import org.springframework.mock.web.MockServletContext; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionProxy; -import com.opensymphony.xwork2.ActionProxyFactory; -import com.opensymphony.xwork2.XWorkTestCase; -import com.opensymphony.xwork2.config.Configuration; -import com.opensymphony.xwork2.util.logging.LoggerFactory; -import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.*; /** * Base test case for JUnit testing Struts. Propchange: struts/struts2/trunk/plugins/junit/src/main/java/org/apache/struts2/StrutsTestCase.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL