论坛首页 Java企业应用论坛

关于WebWork2中Action的测试

浏览 4224 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-04-17  
WebWork2中Action的测试是应该脱离配件文件测试还是不应该?
如下面这个例子
(注:其中Interceptor"permission","LoginInterceptor","component-autowire"都借鉴了Jert中的实现)
public class BaseUploadList extends BaseAction implements Action, Protected {
    private static final long serialVersionUID = 200504170251L;
    
    protected PermissionsManager permissionsManager;

    public PermissionsManager getPermissionsManager(); {
        return permissionsManager;
    }
    

    public void setPermissionsManager(PermissionsManager permissionsManager); {
        this.permissionsManager = permissionsManager;
    }
    
    public String execute(); throws Exception {
        return SUCCESS;
    }

    public boolean hasPermission(); {
        User user = 
            (User);ActionContext.getContext();.getSession();.get(LoginInterceptor.USER_LOGIN);;
        Permissions perms = permissionsManager.getFinalUserPerm(user.getId(););;
        return perms.hasPermission(Permissions.UPLOAD_LIST);;
    }

}

Action配置文件相关内容:
.....
<package name="list" extends="default" namespace="/list">
		<action name="viewUploadList" class="....action.list.BaseUploadList">
			<interceptor-ref name="login"/>
			<interceptor-ref name="component-autowire"/>
		    <interceptor-ref name="params"/>
			<interceptor-ref name="permission"/>
			<result name="success">/list/uploadList.action</result>
			<result name="nopermission">/nopermission.jsp</result>
		</action>
		.....
	</package>
.......

调用这个Action时会验证用户是否有权限进入UploadList页面,因此对这个Action进行测试需要判断两种情况:有或没有权限。
下面是我的两种测试方法,测试都已经通过:
   发表时间:2005-04-17  
一。不脱离Action配置文件的测试:
public class TestBaseUploadList extends TestCase {

    public void testExecuteSuccess(); throws Exception {
        Map session = new HashMap();;
        User user = new UserImpl();;
        user.setId(1L);;
        session.put(LoginInterceptor.USER_LOGIN, user);;
        Map params = new HashMap();;
        params.put("permissionsManager", new MockPermissionsManager(););;
        Map extraContext = new HashMap();;
        extraContext.put(ActionContext.SESSION, session);;
        extraContext.put(ActionContext.PARAMETERS, params);;
        ActionProxy proxy = ActionProxyFactory.getFactory();.createActionProxy(
                "/list", "viewUploadList", extraContext, false);;
        assertEquals(proxy.execute();, "success");;
    }

    public void testExecuteNoPerms(); throws Exception {
        Map session = new HashMap();;
        User user = new UserImpl();;
        user.setId(0L);;
        session.put(LoginInterceptor.USER_LOGIN, user);;
        Map params = new HashMap();;
        params.put("permissionsManager", new MockPermissionsManager(););;
        Map extraContext = new HashMap();;
        extraContext.put(ActionContext.SESSION, session);;
        extraContext.put(ActionContext.PARAMETERS, params);;
        ActionProxy proxy = ActionProxyFactory.getFactory();.createActionProxy(
                "/list", "viewUploadList", extraContext, false);;
        assertEquals(proxy.execute();, "nopermission");;
    }

    private class MockPermissionsManager implements PermissionsManager {
        public Permissions getFinalUserPerm(long userID); {
            return (userID == 1); ? new Permissions(Permissions.UPLOAD_LIST);
                    : new Permissions(0L);;
        }
		.......
    }

}

为了使这个测试能通过,要对Jert中的Interceptor"component-autowire"做一些小小的改变:
public class ComponentAutowireInterceptor implements Interceptor {
   ............
	public String intercept(ActionInvocation invocation); throws Exception {
	    //Jert原来的实现:
		//Application.getInstance();.getContainer();.autowireComponent(invocation.getAction(););;
		if (Application.getInstance();.getContainer(); != null);
            Application.getInstance();.getContainer();.autowireComponent(invocation.getAction(););;
        return invocation.invoke();;
	}

}
0 请登录后投票
   发表时间:2005-04-17  
二。脱离Action配件文件的测试:
public class TestBaseUploadListA extends TestCase {

    public void testHasPermission(); throws Exception {
        Map session = new HashMap();;
        User user = new UserImpl();;
        user.setId(1L);;
        session.put(LoginInterceptor.USER_LOGIN, user);;
        ActionContext.getContext();.setSession(session);;
        BaseUploadList action = new BaseUploadList();;
        action.setPermissionsManager(new MockPermissionsManager(););;
        assertTrue(action.hasPermission(););;
    }
    
    public void testNoPermission(); throws Exception {
        Map session = new HashMap();;
        User user = new UserImpl();;
        user.setId(0L);;
        session.put(LoginInterceptor.USER_LOGIN, user);;
        ActionContext.getContext();.setSession(session);;
        BaseUploadList action = new BaseUploadList();;
        action.setPermissionsManager(new MockPermissionsManager(););;
        assertFalse(action.hasPermission(););;
    }

    private class MockPermissionsManager implements PermissionsManager {
        public Permissions getFinalUserPerm(long userID); {
            return (userID == 1); ? new Permissions(Permissions.UPLOAD_LIST);
                    : new Permissions(0L);;
        }
		..........
    }
}
0 请登录后投票
   发表时间:2005-04-17  
偶的建议是不测试,WebWork的action测试已经接近于集成测试和用户接受度测试,用junit来对action进行测试吃力不讨好。

有空测试action,还不如多写一些代码达到service/manager更多的测试覆盖率。
0 请登录后投票
   发表时间:2005-04-17  
如果WebWork的action测试放到集成测试中的话,那我觉得
用Interceptor"component-autowire"为action注入各种service/manager是不是也是有些多余的,因为我原来是直接通过getBean的方式在action中获取各种service/manager,但后来考虑到要对action进行细粒度级的单元测试,才把它改成通过setter方法来注入的,因为这样我就不必考虑各种service/manager的具体实现,我只要先写一个mock Object就可以先对我的action进行测试,而没必要等到集成测试的时候。
0 请登录后投票
   发表时间:2005-08-23  
引用
偶的建议是不测试,WebWork的action测试已经接近于集成测试和用户接受度测试,用junit来对action进行测试吃力不讨好。

有空测试action,还不如多写一些代码达到service/manager更多的测试覆盖率。

同意这个说法。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics