我們通常在開發(fā)web應(yīng)用過程中,展現(xiàn)層Action的單元測試經(jīng)常被我們忽視了,主要原因是:
1、Action層的業(yè)務(wù)邏輯比較簡單。大家潛意識認(rèn)為這一部分的代碼不重要。
2、Action層難以模擬http請求傳遞參數(shù),需要依賴web容器,因此給單元測試編寫帶來一定的難度。
我寫了一個(gè)簡單的Action單元測試用例,供大家參考。基于struts的mock和webwork的ActionProxyFactory都可以進(jìn)行Action的單元測試。我個(gè)人比較傾向與ActionProxyFactory做單元測試。其實(shí)寫action單元測試非常簡單,大致分為三步就可以完成單元測試:
一、設(shè)置ActionContext上下文參數(shù)
將表單傳遞的請求參數(shù)添加到map中
二、創(chuàng)建Action動態(tài)代理對象
通過public abstract ActionProxy createActionProxy(String namespace, String actionName, Map extraContext) throws Exception 創(chuàng)建action代理對象。
三、junit斷言執(zhí)行結(jié)果
assertEquals(testAction.login(),”success”)
詳細(xì)用例參考:
public class TestActionTest extends BaseCaseTest{
private ActionProxy proxy = null;
private IVoucherService voucherService;
@Before
public void setUp() throws Exception {
IMocksControl control = EasyMock.createControl();
voucherService = control.createMock(IVoucherService.class);
Map<String, Object> params = new HashMap<String, Object>();
params.put(”loginId”,”test”);
params.put(”password”,”111111″);
params.put(”website”,” http://www.bt285.cn ″);
params.put(”name”,”小說″);
params.put(”voucherService”, voucherService);
Map extraContext = new HashMap();
extraContext.put(ActionContext.PARAMETERS,params);
try {
proxy = ActionProxyFactory.getFactory().createActionProxy(”/ http://www.5a520.cn user”, “testAction”, extraContext);
proxy.setExecuteResult(false);
assertEquals(proxy.execute(),”success”);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testLogin() {
TestAction testAction = (TestAction) proxy.getAction();
assertEquals(testAction.login(),”success”);
}
}
注:創(chuàng)建代理action一定要執(zhí)行proxy.execute()方法,否則參數(shù)不能夠增加到actionContext上下文中。因?yàn)閜roxy.execute()中會執(zhí)行 invocation.invoke()核心方法,遍歷執(zhí)行action中所有的攔截器,包括其中的參數(shù)攔截器