【问题标题】:How to set attributes to a mock request inside a J2EE filter which are available in a unit test written for the filter如何在为过滤器编写的单元测试中为 J2EE 过滤器中的模拟请求设置属性
【发布时间】:2013-08-07 18:33:47
【问题描述】:

我有一个名为SomeFilter 的过滤器类,它实现了javax.servlet.Filter。 在 doFilter 方法中,我使用键“key”和值“result”设置了属性“someResult”。

我有一个名为TestSomeFilter 的单元测试类,它调用SomeFilter 的doFilter。现在的问题是我在过滤器中设置的请求属性“someResult”没有被设置。这仅在我进行单元测试(在本地)时发生,即请求是模拟请求。如果我在 websphere 应用程序服务器(本地)上部署过滤器,则属性设置正确。此外,当我在调试模式下运行单元测试时,MockedRequestWrapper 的 setAttribute 不会被调用。

代码如下。

如果有人能帮助我解决我的问题或至少为我指明正确的方向,我将不胜感激。

提前致谢!

代码:

public class SomeFilter implements javax.servlet.Filter {

    public void doFilter(ServletRequest req, 
                   ServletResponse res, FilterChain chain) 
    throws ServletException {

    //do some stuff

    HttpServletRequest request = (HttpServletRequest) req;

    Map<String,String> map = new HashMap<String,String>();
    map.put("key","result");

    request.setAttribute("someResult",map);
    chain.doFilter(request, res);
    }
}

public class TestSomeFilter {

    @org.junit.Test
    public void testSomeFilter {
        HttpServletRequest mockRequest = null;
        HttpServletResponse mockResponse = null;
        HttpSession mockSession = null;
        MockedRequestWrapper mrw = null;

        org.easymock.EasyMock.replay(mockSession);
        org.easymock.EasyMock.replay(mockRequest);
        org.easymock.EasyMock.replay(mockResponse);

        mrw = new MockedRequestWrapper(mockRequest);

        filter.doFilter(mrw, mockResponse, mockFilterChain);

        HashMap<String,String> map = (HashMap<String,String>) mrw        
                                         .getAttribute(("someResult");

        String value = map.get("key");

        org.junit.Assert.assertEquals(
            "The output should be result.", 
            "result", value);
    }

    @org.junit.Before
    public void setUp() throws Exception {
        mockRequest = createNiceMock(HttpServletRequest.class);
        mockResponse = createNiceMock(HttpServletResponse.class);
        mockSession = createNiceMock(HttpSession.class);
    }

    @org.junit.After
    public void tearDown() throws Exception {}

    public class MockedFilterChain implements FilterChain {

        public void doFilter(ServletRequest request, 
                        ServletResponse response) 
                    throws ServletException {}
    }
}

public class MockedRequestWrapper extends HttpServletRequestWrapper {

    private Map<String,Object> m = null;
    public MockedRequestWrapper(HttpServletRequest httpServletRequest) {
            super(httpServletRequest);
    }

    public void setAttribute(String name, Object o){            
        m = new HashMap<String,Object>();
        m.put(name, o);         
    }

    public Object getAttribute(String name){
        return m.get(name);//<<<< PROBLEM: This map is always null causing NPE
    }
}

【问题讨论】:

    标签: jakarta-ee junit servlet-filters easymock


    【解决方案1】:

    我找到了解决方案。包装类需要这样修改:

    public class MockedRequestWrapper extends HttpServletRequestWrapper {
    
        private Map<String,Object> m = null;
        private HttpServletRequest origReq = null;
    
        public MockedRequestWrapper(HttpServletRequest httpServletRequest) 
            throws IOException, ServletException {
            super(httpServletRequest);
            origReq = httpServletRequest;
        }
    
        @Override
        public void setAttribute(String name, Object o){            
            m = new HashMap<String,Object>();
            m.put(name, o);
            super.setAttribute(name, o);
            origReq.setAttribute(name, o);
        }
    
        @Override
        public Object getAttribute(String name){
            if(m != null){
                return m.get(name);
            } else if(origReq.getAttribute(name) != null){
                return origReq.getAttribute(name);
            } else {
                return super.getAttribute(name);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 1970-01-01
      • 2014-12-22
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 2020-09-29
      相关资源
      最近更新 更多