You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by bartlebooth <ba...@telenet.be> on 2007/07/17 19:15:32 UTC
Struts2 StrutsTestCase
Hello,
I'm fairly new to Struts 2. I'm currently migrating a project from
Struts 1 to Struts 2, but I'd like to make heavy use of Unit Testing to
aid in the migration.
In the documentation, the testability of the new actions is often
mentioned. However, I have the impression that it's not that simple at all.
I put some work into using the StrutsTestCase class as base class for my
tests, but I've run into some problems that I can't really understand.
1. There is hardly any documentation regarding the StrutsTestCase or the
XWorkTestCase base classes. Not in the documentation, not in the mail
archives, not even the issue tracker. Is anyone using these classes at all ?
I've found a short part in Ian Roughley's book Starting Struts 2, but
the example did not work for me.
2. I did found some examples in the struts2-showcase web application,
and building upon these, I succeeded in setting up my test cases.
I have my base class, with the setup of request and session objects, the
code of which is shown below (picked from the
ExecuteAndWaitInterceptorTest class in the showcase source code).
public abstract class BaseTestCase extends StrutsTestCase {
protected StrutsMockHttpServletRequest request;
protected HttpSession httpSession;
protected Map<String, Object> context;
protected Map<String, Object> params;
protected Map<String, Object> session;
protected ServletContext servletContext;
protected void setUp() throws Exception {
//super.setUp(); <--------- Does not work !!!!!
loadConfigurationProviders(new LocationConfigurationProvider());
session = new HashMap<String, Object>();
params = new HashMap<String, Object>();
context = new HashMap<String, Object>();
context.put(ActionContext.SESSION, session);
context.put(ActionContext.PARAMETERS, params);
request = new StrutsMockHttpServletRequest();
request.setParameterMap(params);
context.put(ServletActionContext.HTTP_REQUEST, request);
servletContext = new MockServletContext();
servletContext.setAttribute(DaoPlugIn.DAOMANAGER,
DaoConfig.getDaoManager());
context.put(ServletActionContext.SERVLET_CONTEXT, servletContext);
UserInfo userInfo = ..
...
session.put(AppConstants.APP_USER_INFO_KEY, userInfo);
}
// can be overridden by subclasses
public List<InterceptorMapping> getInterceptors() {
List<InterceptorMapping> interceptors = new
ArrayList<InterceptorMapping>();
interceptors.add(new InterceptorMapping("servlet", new
ServletConfigInterceptor()));
interceptors.add(new InterceptorMapping("params", new
ParametersInterceptor()));
interceptors.add(new InterceptorMapping("prepare", new
PrepareInterceptor()));
interceptors.add(new InterceptorMapping("params", new
ParametersInterceptor()));
return interceptors;
}
// can be overridden by subclasses
public Map<String, ResultConfig> getResultConfig() {
Map<String, ResultConfig> results = new HashMap<String,
ResultConfig>();
results.put(Action.SUCCESS, new ResultConfig(Action.SUCCESS,
MockResult.class.getName(), null));
return results;
}
// every test class will test a particular action class
public abstract Class getActionClass();
// add package configurations, containing action names, method
names, ...
// this is specific for each test class, so here's only an abstract
method
public abstract void getPackageConfigs(Configuration configuration);
private class LocationConfigurationProvider implements
ConfigurationProvider {
Configuration configuration;
public void destroy() {
//waitInterceptor.destroy();
}
public boolean needsReload() {
return false;
}
public void init(Configuration configuration) throws
ConfigurationException {
this.configuration = configuration;
}
public void loadPackages() throws ConfigurationException {
getPackageConfigs(configuration);
}
public void register(ContainerBuilder builder,
LocatableProperties props) throws ConfigurationException {
builder.factory(ObjectFactory.class);
builder.factory(ActionProxyFactory.class,
DefaultActionProxyFactory.class);
}
}
}
The problem I've found is that it is not possible to execute
super.setUp()
When adding or uncommenting this line, I get an error
17 Jul 2007 18:42:01,589 - FATAL
org.apache.struts2.spring.StrutsSpringObjectFactory - ********** FATAL
ERROR STARTING UP SPRING-STRUTS INTEGRATION **********
Looks like the Spring listener was not configured for your web app!
Nothing will work until WebApplicationContextUtils returns a valid
ApplicationContext.
You might need to add the following to web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
The Spring listener IS configured in my web.xml, but it seems that the
test case cannot find the web.xml file itself, even though I put the
WEB-INF directory, and the directory containing the WEB-INF directory in
the classpath. I also have the impression that my current Test
configuration does not use the struts.xml file at all (that's why I have
to explicitly set the package configuration via the getPackageConfigs
method). This is a pity, since I would like to have any modification in
my struts.xml file reflected in my tests.
Is it possible anyhow to configure the StrutsTestCase to use the web.xml
file.
Is there any documentation on how to configure the StrutsTestCase
correctly to use the web configuration ?
Any pointers are welcome.
Thanks,
bartlebooth
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org