[RESOLVIDO] Struts2 + Teste = Como fazer

Boa noite pessoal,

Estou tentando realizar testes unitários no struts 2, porém não consegui fazer nada ainda. Se alguém puder me dar uma mão eu agradeço.

Antes que alguém diga “peça para o ‘pai google’ baixar a resposta”, já dei uma olhada e sai mais confuso do que antes. Tipo tem uns códigos como este aqui para se fazer o teste:

package jubernate.actions;

import java.util.HashMap;

import junit.framework.TestCase;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.views.JspSupportServlet;
import org.springframework.context.ApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletConfig;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.ContextLoader;

import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionProxyFactory;

/**
 * @author Zarar Siddiqi
 */
public abstract class BaseStrutsTestCase extends TestCase {
        //Localização do ApplicationContext do Spring
	private static final String CONFIG_LOCATIONS = "file:C:\\Users\\Juba\\Documents\\Novos_PrOgRaMaS\\jubernate\\src\\main\\webapp\\WEB-INF\\applicationContext.xml";
	private static ApplicationContext applicationContext;
	private Dispatcher dispatcher;
	protected ActionProxy proxy;
	protected static MockServletContext servletContext;
	protected static MockServletConfig servletConfig;
	protected MockHttpServletRequest request;
	protected MockHttpServletResponse response;

	public BaseStrutsTestCase(String name) {
		super(name);
	}

	/**
	 * Created action class based on namespace and name
	 * 
	 * @param clazz
	 *            Class for which to create Action
	 * @param namespace
	 *            Namespace of action
	 * @param name
	 *            Action name
	 * @return Action class
	 * @throws Exception
	 *             Catch-all exception
	 */
	@SuppressWarnings("unchecked")
	protected <T> T createAction(Class<T> clazz, String namespace, String name)
			throws Exception {

		// create a proxy class which is just a wrapper around the action call.
		// The proxy is created by checking the namespace and name against the
		// struts.xml configuration
		proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class)
				.createActionProxy(namespace, name, null, true, false);

		// by default, don't pass in any request parameters
		proxy.getInvocation().getInvocationContext()
				.setParameters(new HashMap());

		// do not execute the result after executing the action
		proxy.setExecuteResult(true);

		// set the actions context to the one which the proxy is using
		ServletActionContext.setContext(proxy.getInvocation()
				.getInvocationContext());
		request = new MockHttpServletRequest();
		response = new MockHttpServletResponse();
		ServletActionContext.setRequest(request);
		ServletActionContext.setResponse(response);
		ServletActionContext.setServletContext(servletContext);
		return (T) proxy.getAction();
	}

	protected void setUp() throws Exception {

		System.out.println(System.getProperties());

		if (applicationContext == null) {
			// this is the first time so initialize Spring context
			servletContext = new MockServletContext();
			servletContext.addInitParameter(
					ContextLoader.CONFIG_LOCATION_PARAM, CONFIG_LOCATIONS);
			applicationContext = (new ContextLoader())
					.initWebApplicationContext(servletContext);

			// Struts JSP support servlet (for Freemarker)
			new JspSupportServlet().init(new MockServletConfig(servletContext));
		}
		// Dispatcher is the guy that actually handles all requests. Pass in
		// an empty. Map as the parameters but if you want to change stuff like
		// what config files to read, you need to specify them here. Here's how
		// to
		// scan packages for actions (thanks to Hardy Ferentschik - Comment 66)
		// (see Dispatcher's source code)
		HashMap params = new HashMap();
		params.put("actionPackages", "jubernate.actions");

               //Penei para descobrir quue era assim que eu indicava o lugar do meu struts.xml
		params.put(
				"config",
				"file:C:\\Users\\Juba\\Documents\\Novos_PrOgRaMaS\\jubernate\\src\\main\\resources\\struts.xml");
		dispatcher = new Dispatcher(servletContext, params);
		dispatcher.init();
		Dispatcher.setInstance(dispatcher);
	}
}

Segundo o que li era só extender esta classe abstrata na classe de teste e pimba… Mas não foi assim… Primeiro dava um erro para localizar o ApplicationContext.xml - Depois de uma hora problema resolvido (tinha de referenciar a localização física do arquivo e utilizar a palavra “file” antes do endereço), depois o mesmo problema para o struts.xml, só que dessa vez tinha de por dentro Map. Agora tá dando este erro:

2012-12-10 23:13:46,945 ERROR org.apache.struts2.dispatcher.Dispatcher.error:38 - Dispatcher initialization failed
com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory).
	at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:144)
	at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMethods(ContainerImpl.java:113)
	at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:90)
	at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:86)
	at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:71)
	at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:67)
	at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)
	at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)
	at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:490)
	at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:530)
	at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:528)
	at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:580)
	at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:528)
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:233)
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)
	at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390)
	at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437)
	at jubernate.actions.BaseStrutsTestCase.setUp(BaseStrutsTestCase.java:106)
	at junit.framework.TestCase.runBare(TestCase.java:132)
	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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory).
	at com.opensymphony.xwork2.inject.ContainerImpl.createParameterInjector(ContainerImpl.java:239)
	at com.opensymphony.xwork2.inject.ContainerImpl.getParametersInjectors(ContainerImpl.java:229)
	at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.<init>(ContainerImpl.java:293)
	at com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:117)
	at com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:114)
	at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:141)
	... 34 more

Dando uma olhada dentro dos fontes, descobri que tem uma classe chamada org.apache.struts2.dispatcher.Dispatcher e que as configurações dela estão nulas (configurationManager.getConfiguration() == null).

Bom… como disse se alguém souber como testar o struts2 e poder compartilhar comigo ou souber como corrigo este erro, eu agradeço e muito.

Inté…

Está usando apenas Struts 2 ou Spring Framework também?
O applicationContext.xml é o arquivo de configuração dos beans do Spring Framework e, provavelmente, você tenha tido problemas com as configurações por esta razão.
Outra coisa, teu struts.xml fica na raiz do código (famigerada pasta src). Isso significa que não precisaria referenciar o caminho absoluto. Você deveria usar um caminho relativo, obtendo o contexto da aplicação.

Boa tarde,

Primeiro queria te agradecer drsmachado porque esta não é a primeira que você me ajuda. Em segundo lugar estou utilizando o Struts e o Spring (o meu applicationContext.xml está dentro de WEB-INF). Realmente deu certo por o caminho relativo do struts.xml e realmente você está certo, o problema está com o Spring. Acabei de fazer um debug e o erro que está acontecendo é que o struts, durante o teste, não consegue carregar o Spring (“Cannot locate the chosen ObjectFactory implementation: spring - [unknown location]”). Depois tentei mudar o caminho do applicationContext.xml, deixando igual ao do WEB-INF, com /WEB-INF/applicationContext.xml, mas não rolou, deu este erro:

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
	at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
	at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:527)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:441)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
	at jubernate.actions.BaseStrutsTestCase.setUp(BaseStrutsTestCase.java:89)
	at junit.framework.TestCase.runBare(TestCase.java:132)
	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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
	at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:140)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
	... 26 more

Acho que realmente o erro está com o Spring, não sei o que fazer ainda, mas acho que já é um caminho.

Mais uma vez valeu pela ajuda

Inté…

Camarada, não precisa agradecer. Estamos no mesmo barco, se não ajudarmos uns aos outros a remar, ele afunda.
Seguinte, vou postar a lista de jars que você deve utilizar. Creio que o problema seja com o struts2-spring-plugin.jar, eu vivo tendo problemas com ele ou ainda, você não colocou os jars do Spring no projeto, o que mais me parece a causa do problema.
Em tempo, embora o Struts possua alguns jars com nome spring-xxxxxxx.jar, não é recomendado o uso dos mesmos.

Camarada, segue a lista de jars que uso.
Só os jars do commons-xxx que não sei se usa todos, mas eu os coloco pra evitar erros.



Boa noite,

Primeiro peço desculpas por não ter respondido ainda, é que tive uma semana difícil. Dos meus testes com os “testes”, descobri que os jars não ajudaram muito, embora tenha me mostrado que a integração com o spring vai muito além do que só a injeção de dependências(O que é muito bom mesmo, abre possibilidades). Sou sincero em dizer que ainda não consegui fazer o trem funcionar, mas tô no caminho… Descobri que para a classe “StrutsSpringTestCase” funcionar só faltava o jar “jsp-api” (no meu caso o específico do tomcat, pq se não da pau). Como disse ainda não está funcionando, só que apresenta dois erros diferentes, um só aparece no console e o outro aparece só na interface do JUnit (estou usando o Eclipse). O primeiro erro é este aqui:


2012-12-17 23:16:38,849 WARN  org.springframework.mock.web.MockServletContext.getResourcePaths:221 - Couldn't get resource paths for class path resource [login/]
java.io.FileNotFoundException: class path resource [login/] cannot be resolved to URL because it does not exist
	at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:177)
	at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:48)
	at org.springframework.mock.web.MockServletContext.getResourcePaths(MockServletContext.java:205)
	at org.apache.struts2.convention.DefaultResultMapBuilder.createFromResources(DefaultResultMapBuilder.java:254)
	at org.apache.struts2.convention.DefaultResultMapBuilder.build(DefaultResultMapBuilder.java:191)
	at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:891)
	at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:674)
	at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:345)
	at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53)
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:245)
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)
	at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390)
	at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437)
	at org.apache.struts2.util.StrutsTestCaseHelper.initDispatcher(StrutsTestCaseHelper.java:54)
	at org.apache.struts2.StrutsTestCase.initDispatcher(StrutsTestCase.java:245)
	at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:225)
	at junit.framework.TestCase.runBare(TestCase.java:132)
	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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Até agora já descobri que este erro está sendo causado pelas classe que eu pus a anotação “@Namespace” do Struts e por alguma causa/razão/motivo que eu desconheço o Spring tá tentando interpretar. O outro erro é este aqui:

java.lang.IllegalStateException: Context attribute is not of type WebApplicationContext: org.springframework.context.support.GenericApplicationContext@1ec6696: startup date [Mon Dec 17 23:16:24 BRST 2012]; root of context hierarchy
	at org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(WebApplicationContextUtils.java:130)
	at org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(WebApplicationContextUtils.java:105)
	at jubernate.actions.GrupoAct.editaPermissoes(GrupoAct.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:50)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
	at jubernate.actions.GrupoActTeste.testaRetorno(GrupoActTeste.java:37)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Como eu já tinha dito, este erro só aparece na interface do JUnit. Este erro me anima um pouco porque ele menciona a classe “GrupoAct”, que é a classe que estou tentando testar e pelo menos se aparece é porque chega até lá. Nesta classe o problema é neste trecho de código:

		ApplicationContext apx = WebApplicationContextUtils
				.getWebApplicationContext(ServletActionContext
						.getServletContext());

Sei que a classe StrutsSpringTestCase tem o método “setupBeforeInitDispatcher()” que já inicia o WebApplicationContext, mas por algum motivo o mesmo não está funcionando (dá para ver esta classe aki -> http://javasourcecode.org/html/open-source/struts/struts-2.2.3/org/apache/struts2/StrutsSpringTestCase.java.html).

Gostaria de agradecer a quem puder dar uma mão e drsmachado me desculpe não ter respondido antes, é que a semana foi muito feia mesmo.

Inté…

Definitivamente, não entendo por que querer usar essa abordagem.
Invoca o listener do spring mesmo, no web.xml.
Aqui um bom exemplo

Meu amigo drsmachado muito obrigado, muitissimo obrigado.

Arrumei de acordo com a sua indicação e, depois de aproximadamente uma semana, consegui fazer o bendito teste. Realmente foi só mudar a abordagem (não sabia que dava para juntar o Spring deste jeito - agora a forma que eu estava usando parece um grande exemplo de POG avançado) que o teste passou de boa.

Muitíssimo obrigado mesmo.

Inté…