我們通常在開(kāi)發(fā)web應(yīng)用過(guò)程中,展現(xiàn)層Action的單元測(cè)試經(jīng)常被我們忽視了,主要原因是:

  1、Action層的業(yè)務(wù)邏輯比較簡(jiǎn)單。大家潛意識(shí)認(rèn)為這一部分的代碼不重要。

  2、Action層難以模擬http請(qǐng)求傳遞參數(shù),需要依賴web容器,因此給單元測(cè)試編寫帶來(lái)一定的難度。

  下面是一個(gè)簡(jiǎn)單的Action單元測(cè)試用例,供大家參考。基于struts的mock和webwork的ActionProxyFactory都可以進(jìn)行Action的單元測(cè)試。我個(gè)人比較傾向與ActionProxyFactory做單元測(cè)試。其實(shí)寫action單元測(cè)試非常簡(jiǎn)單,大致分為三步就可以完成單元測(cè)試:

  一、設(shè)置ActionContext上下文參數(shù)

  將表單傳遞的請(qǐng)求參數(shù)添加到map中

  二、創(chuàng)建Action動(dòng)態(tài)代理對(duì)象

  通過(guò)public abstract ActionProxy createActionProxy(String namespace, String actionName, Map extraContext) throws Exception 創(chuàng)建action代理對(duì)象。

  三、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(”voucherService”, voucherService);

  Map extraContext = new HashMap();

  extraContext.put(ActionContext.PARAMETERS,params);

  try {

  proxy = ActionProxyFactory.getFactory().createActionProxy(”/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)?proxy.execute()中會(huì)執(zhí)行 invocation.invoke()核心方法,遍歷執(zhí)行action中所有的攔截器,包括其中的參數(shù)攔截器。
(轉(zhuǎn)載):testage.net