Remember that in Struts 2, an action is usually called before and after various other interceptors are invoked.
Interceptor configuration is usually specified in the struts.xml file.
At this point we need to cover three different methods of how you might want to call your actions.
1. Specify request parameters which are translated and mapped to the actions domain objects (id in the PersonAction class) and then execute the action while also executing all configured interceptors.
2. Instead of specifying request parameters, directly specify the values of the domain objects and then execute the action while also executing all configured interceptors.
3.Finally, you just might want to execute the action and not worry about executing the interceptors. Here you’ll specify the values of the actions domain objects and then
execute the action.
http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/
为了防止原文不能打开,现把其内容COPY如下:
Depending on what you’re testing and what scenario you want to reproduce, you should pick the one that suits the case. There’s an example of all three cases below. The best way I find to test all your action classes is to have one base class which sets up the Struts 2 environment and then your action test classes can extend it. Here’s a class that could be used as one of those base classes.
要测试的ACTION
public class PersonAction extend ActionSupport {
02
03 private int id;
04
05 public int getId() {
06 return id;
07 }
08 public void setId(int id) {
09 this.id = id;
10 }
11 public String deletePerson() {
12 ....
13 return SUCCESS;
14 }
BaseStrutsTestCase
import com.opensymphony.xwork2.ActionProxy;
02 import com.opensymphony.xwork2.ActionProxyFactory;
03 import junit.framework.TestCase;
04 import org.apache.struts2.ServletActionContext;
05 import org.apache.struts2.dispatcher.Dispatcher;
06 import org.apache.struts2.views.JspSupportServlet;
07 import org.springframework.context.ApplicationContext;
08 import org.springframework.mock.web.MockHttpServletRequest;
09 import org.springframework.mock.web.MockHttpServletResponse;
10 import org.springframework.mock.web.MockServletConfig;
11 import org.springframework.mock.web.MockServletContext;
12 import org.springframework.web.context.ContextLoader;
13
14 import java.util.HashMap;
15
16 /**
17 * @author Zarar Siddiqi
18 */
19 public abstract class BaseStrutsTestCase extends TestCase {
20 private static final String CONFIG_LOCATIONS = "META-INF/applicationContext-app.xml," +
21 "META-INF/applicationContext-security.xml";
22 private static ApplicationContext applicationContext;
23 private Dispatcher dispatcher;
24 protected ActionProxy proxy;
25 protected static MockServletContext servletContext;
26 protected static MockServletConfig servletConfig;
27 protected MockHttpServletRequest request;
28 protected MockHttpServletResponse response;
29
30 public BaseStrutsTestCase(String name) {
31 super(name);
32 }
33
34 /**
35 * Created action class based on namespace and name
36 * @param clazz Class for which to create Action
37 * @param namespace Namespace of action
38 * @param name Action name
39 * @return Action class
40 * @throws Exception Catch-all exception
41 */
42 @SuppressWarnings("unchecked")
43 protected <t> T createAction(Class<t> clazz, String namespace, String name)
44 throws Exception {
45
46 // create a proxy class which is just a wrapper around the action call.
47 // The proxy is created by checking the namespace and name against the
48 // struts.xml configuration
49 proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class).
50 createActionProxy(
51 namespace, name, null, true, false);
52
53 // by default, don't pass in any request parameters
54 proxy.getInvocation().getInvocationContext().
55 setParameters(new HashMap());
56
57 // do not execute the result after executing the action
58 proxy.setExecuteResult(true);
59
60 // set the actions context to the one which the proxy is using
61 ServletActionContext.setContext(
62 proxy.getInvocation().getInvocationContext());
63 request = new MockHttpServletRequest();
64 response = new MockHttpServletResponse();
65 ServletActionContext.setRequest(request);
66 ServletActionContext.setResponse(response);
67 ServletActionContext.setServletContext(servletContext);
68 return (T) proxy.getAction();
69 }
70
71 protected void setUp() throws Exception {
72 if( applicationContext == null ) {
73 // this is the first time so initialize Spring context
74 servletContext = new MockServletContext();
75 servletContext.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
76 CONFIG_LOCATIONS);
77 applicationContext = (new ContextLoader()).initWebApplicationContext(servletContext);
78
79 // Struts JSP support servlet (for Freemarker)
80 new JspSupportServlet().init(new MockServletConfig(servletContext));
81 }
82 // Dispatcher is the guy that actually handles all requests. Pass in
83 // an empty. Map as the parameters but if you want to change stuff like
84 // what config files to read, you need to specify them here. Here's how to
85 // scan packages for actions (thanks to Hardy Ferentschik - Comment 66)
86 // (see Dispatcher's source code)
87 HashMap params = new HashMap();
88 params.put("actionPackages", "com.arsenalist.action");
89 dispatcher = new Dispatcher(servletContext, params);
90 dispatcher.init();
91 Dispatcher.setInstance(dispatcher);
92 }
93 }
By extending the above class for our action test classes we can easily simulate any of the three scenarios listed above. I’ve added three methods to PersonActionTest which illustrate how to test the above three cases: testInterceptorsBySettingRequestParameters, testInterceptorsBySettingDomainObjects() and testActionAndSkipInterceptors(), respectively.
public class PersonActionTest extends BaseStrutsTestCase { 02 03 /** 04 * Invoke all interceptors and specify value of the action 05 * class' domain objects directly. 06 * @throws Exception Exception 07 */ 08 public void testInterceptorsBySettingDomainObjects() 09 throws Exception { 10 PersonAction action = createAction(PersonAction.class, 11 "/site", "deletePerson"); 12 action.setId(123); 13 String result = proxy.execute(); 14 assertEquals(result, "success"); 15 } 16 17 /** 18 * Invoke all interceptors and specify value of action class' 19 * domain objects through request parameters. 20 * @throws Exception Exception 21 */ 22 public void testInterceptorsBySettingRequestParameters() 23 throws Exception { 24 createAction(PersonAction.class, "/site", "deletePerson"); 25 request.addParameter("id", "123"); 26 String result = proxy.execute(); 27 assertEquals(result, "success"); 28 } 29 30 /** 31 * Skip interceptors and specify value of action class' 32 * domain objects by setting them directly. 33 * @throws Exception Exception 34 */ 35 public void testActionAndSkipInterceptors() throws Exception { 36 PersonAction action = createAction(PersonAction.class, 37 "/site", "deletePerson"); 38 action.setId(123); 39 String result = action.deletePerson(); 40 assertEquals(result, "success"); 41 } 42 }
下面就举几个例子加以说
1 测试DAO
/**
*
*/
package org.macaulites.test;
import org.macaulites.dao.LegislationDao;
import org.macaulites.dao.hibernate.LegislationDaoHibernate;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
* @author zhj-macau
*
*/
public class LegislationDaoTest extends TestCase {
private LegislationDao legDao;
/**
* @param name
*/
public LegislationDaoTest(String name) {
super(name);
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
legDao = new LegislationDaoHibernate();
ApplicationContext ctx = new FileSystemXmlApplicationContext("C:\\Users\\zhj-macau\\workspace\\macaulites\\src\\applicationContext.xml");
legDao = (LegislationDao) ctx.getBean("legDao");
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
}
public void testFindByName() throws Exception
{
assertNotNull(legDao.findByName("taxLaw"));
}
}
这种测试会加载配置文件,连接数据库