您的位置:首页 > 其它

编写Action单元测试用例

2009-03-17 12:59 260 查看
 我们通常在开发web应用过程中,展现层Action的单元测试经常被我们忽视了,主要原因是:

1、action层的业务逻辑比较简单。大家潜意识认为这一部分的代码不重要。

2、action层难以模拟http请求传递的参数,依赖web容器,给单元测试编写带来一定的难度。

 

我写了一个简单的action单元测试用例,供大家参考。基于struts的mock和webwork的ActionProxyFactory都可以进行action的单元测试。我个人比较倾向与ActionProxyFactory做单元测试。其实写action单元测试非常简单,大致分为三步就可以完成单元测试:

一、设置actionContext上下文参数

    将表单传递的请求参数添加到map中

二、创建action动态代理对象

    通过public abstract ActionProxy createActionProxy(String namespace, String actionName, Map extraContext) throws Exception 创建action代理对象。

三、junit断言执行结果

    assertEquals(testAction.login(),"success")

详细用例参考

 
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");
}
}


注:创建代理action一定要执行proxy.execute()方法,否则参数不能够增加到actionContext上下文中。因为proxy.execute()中会执行 invocation.invoke()核心方法,遍历执行action中所有的拦截器,包括其中的参数拦截器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息