Changes between Version 1 and Version 2 of demo_06


Ignore:
Timestamp:
04/05/2012 04:18:46 PM (14 years ago)
Author:
chenyang
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • demo_06

    v1 v2  
    11== 单元测试应用示例——测试Filter  == 
     2游戏大厅中的AdminAuthFilter,用来检验用户有没有防问被保护的jsp权限,代码如下[[BR]] 
     3{{{ #!java 
     4@Override 
     5        public void doFilter(ServletRequest req, ServletResponse resp, 
     6                        FilterChain chain) throws ServletException, IOException { 
     7                 
     8                HttpServletRequest request = (HttpServletRequest)req; 
     9                HttpServletResponse response = (HttpServletResponse)resp; 
     10                 
     11                //请求路径 
     12                String requestURI = request.getRequestURI(); 
     13                 
     14                EnvInterface env = (EnvInterface) req.getAttribute("env"); 
     15                 
     16                if(env.getUserInfo().getId() <= 0){ 
     17                        log.info("非法访问:"+requestURI); 
     18                        response.sendRedirect(env.getRoot()+"/admin/login.jsp"); 
     19                        return; 
     20                }else{ 
     21                        if(Pattern.matches(".+/admin/game/action/.+", requestURI)){ 
     22                                //管理员才有权限访问该目录下的资源 
     23                                if(!env.isAdmin()){ 
     24                                        log.info("无权限访问:"+request.getRequestURI()); 
     25                                        response.sendRedirect(env.getRoot()+"/admin/login.jsp"); 
     26                                }else{ 
     27                                        chain.doFilter(req, resp); 
     28                                } 
     29                        }else{ 
     30                                chain.doFilter(req, resp); 
     31                        } 
     32                } 
     33        } 
     34}}} 
     35filter依赖HttpServletRequest,HttpServletResponse,FilterChain等对象,比较难测试,我们可以通过使用Spring测试框架提供的模拟对象,来辅助我们使用junit来测试。我们看到该doFilter方法中还依赖[[BR]] 
     36Env对象,该对象非常复杂,非常难模拟。我们的测试似乎很难进行了,但我们如果使用了jMock的话,也能解决模拟Env对象,jMock模拟一个对象时,要求该对象必须实现某个接口,然后模拟该接口。[[BR]] 
     37而Env对象并未实现任何接口,为了编写单元测试,我们让Env去实现EnvInterface接口 
     38{{{ #!java 
     39 /** 
     40 *  
     41 * @author ChenYang 
     42 * Date: 2012-1-10 
     43 */ 
     44public interface EnvInterface { 
     45         
     46        public User getUser(); 
     47         
     48        public UserInfo getUserInfo(); 
     49         
     50        public String getRoot(); 
     51         
     52        public boolean isAdmin(); 
     53} 
     54 
     55}}} 
     56 
     57Env实现EnvInterface 接口 
     58{{{ #!java 
     59public class Env implements EnvInterface{ 
     60 .................. 
     61} 
     62}}} 
     63 
     64这次我们不选择Spring测试框架的提供Web模拟对象,改用jmock去模拟Web对象 
     65{{{ #!java 
     66        /** 
     67         * 测试用户没有登陆 
     68         * @throws Exception 
     69         */ 
     70        @Test 
     71        public void doFilter() throws Exception { 
     72                 
     73                Mockery ctx = new Mockery(); 
     74 
     75                //jMock模拟HttpServletRequest  
     76                final HttpServletRequest request = ctx.mock(HttpServletRequest.class); 
     77 
     78                //jMock模拟HttpServletResponse  
     79                final HttpServletResponse response = ctx.mock(HttpServletResponse.class); 
     80 
     81                //jMock模拟FilterChain  
     82                final FilterChain chain = ctx.mock(FilterChain.class); 
     83                 
     84                //jMock模拟chain  
     85                final EnvInterface env = ctx.mock(EnvInterface.class); 
     86                 
     87                final UserInfo user = new UserInfo(); 
     88                 
     89                ctx.checking(new Expectations(){ 
     90                        { 
     91                                //期望request.getAttribute("env");会调用一次,并返回env 
     92                                one(request).getAttribute("env"); 
     93                                will(returnValue(env)); 
     94                                 
     95                                 //期望request.getRequestURI();会调用一次,并返回"http://g2.pcgames.com.cn/admin/game/game.jsp" 
     96                                one(request).getRequestURI(); 
     97                                will(returnValue("http://g2.pcgames.com.cn/admin/game/game.jsp")); 
     98                                 
     99                                  //期望env.getUserInfo();会调用一次,并返回user 
     100                                one(env).getUserInfo(); 
     101                                will(returnValue(user)); 
     102                                 
     103                                //期望env.getRoot();会调用一次,并返回"http://g2.pcgames.com.cn" 
     104                                one(env).getRoot(); 
     105                                will(returnValue("http://g2.pcgames.com.cn")); 
     106                                 
     107                                //期望response.sendRedirect("http://g2.pcgames.com.cn/admin/login.jsp");会调用一次 
     108                                one(response).sendRedirect("http://g2.pcgames.com.cn/admin/login.jsp"); 
     109                        } 
     110                }); 
     111                 
     112                AdminAuthFilter filter = new AdminAuthFilter(); 
     113                filter.doFilter(request, response, chain); 
     114                 
     115        } 
     116}}}