2017-05-16 2 views
0

私はmockitoとHttpSessionクラスでユニットテストを行う方法を長い間探しています。私は何も見つけていないので、ここで尋ねています。HttpSessionを使用したMockitoによるユニットテストサーブレットフィルタ

私はJavaEEでWebアプリケーションを持っています。カスタムのUserクラスを使用してWebサイトにログオンする3つのフィルタを実装しました。ユーザーのタイプごとに1つのフィルター。私はJUnitとMockitoでそれらをテストする必要があります。ここでの唯一の問題は、httpSessionとhttpServletRequestの動作を再現することに成功しなかったことです。 テストがフィルタコードを通過するときに、session.getAttribute("User")になると、nullポインタ例外が返されます。 このコードで視力を上げてもらえますか?基本的には、セッションをエミュレートして「user」属性を取得し、リダイレクトが正しいかどうかを検証する必要があります。

フィルターコード:

/** 
* Default constructor. 
*/ 
public RestrictionFilterCaseAdmin () 
{ 
    // TODO Auto-generated constructor stub 
} 


/** 
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 
*/ 
public void doFilter(ServletRequest req , ServletResponse res , 
       FilterChain chain) 
       throws IOException , ServletException 
{ 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 

    HttpSession session = request.getSession(); 

    /* Creating temp user */ 
    if (session.getAttribute("User") != null) { 
     User userTmp = new User(); 
     userTmp = (User) session.getAttribute("User"); 

     /** 
     * If the user object don't exist, the user is not 
     * connected. 
     */ 
     if (userTmp.getLogin() == null) { 
      /* Public page redirection */ 
      response.sendRedirect(request.getContextPath() 
          + "/connexion"); 
     } else if (userTmp.getStatus().equals("admin")) { 
      /* Restricted page redirection */ 
      chain.doFilter(request , response); 
     } else { 
      // User not allowed to dislay the page, go back 
      // to home. 
      response.sendRedirect(request.getContextPath() 
          + "/redirect"); 
     } 
    } else { 
     response.sendRedirect(request.getContextPath() 
         + "/connexion"); 
    } 
} 


@ Override 
public void destroy() 
{ 
    // TODO Auto-generated method stub 

} 


@ Override 
public void init(FilterConfig arg0) throws ServletException 
{ 
    // TODO Auto-generated method stub 

} 

テストコード:

@ Mock 
HttpServletRequest httpServletRequest; 

@ Mock 
HttpServletResponse httpServletResponse; 

@ Mock 
FilterChain  filterChain; 

@ Mock 
User   userTest; 

@ Mock 
HttpSession  sessionTest; 


@ Before 
public void setUp() 
{ 
    httpServletRequest = mock(HttpServletRequest.class); 
    httpServletResponse = mock(HttpServletResponse.class); 
    filterChain = mock(FilterChain.class); 
    userTest = mock(User.class); 
    sessionTest = mock(HttpSession.class); 
} 


@ Test 
public void testDoFilter() throws IOException , ServletException 
{ 
    userTest.setLogin("test"); 
    userTest.setPwd("test"); 
    userTest.setStatus("admin"); 
    sessionTest.setAttribute("User" , userTest); 
    when(sessionTest.getAttribute("User")) 
        .thenReturn(userTest); 
    when(httpServletRequest.getSession(true)) 
        .thenReturn(sessionTest); 
    when(httpServletRequest.getRequestURI()) 
        .thenReturn("/Home.jsp"); 
    RestrictionFilterCaseAdmin adminFilter = new RestrictionFilterCaseAdmin(); 
    adminFilter.doFilter(httpServletRequest , httpServletResponse , 
        filterChain);s 
    verify(httpServletResponse).sendRedirect(
        "/restricted/admin/restrictedAdminTest.jsp"); 
} 

はどうもありがとうございました! JK

答えて

0

フィルタは、このセッションを取得するために行います。

HttpSession session = request.getSession(); 

しかし、テストは、これはモックセッションを提供するために、モック要求を設定するために行います。

when(httpServletRequest.getSession(true)).thenReturn(sessionTest); 

request.getSession()request.getSession(true)ですがnullのセッションオブジェクトを生成し、例外をスローする同じメソッドシグネチャではありません。設定を変更してみてください:

when(httpServletRequest.getSession()).thenReturn(sessionTest); 

サイドノート - @Mockアノテーションはインスタンスを作成します(テストクラスをと仮定すると@RunWith(Mockito ...)である)ので、setUp内のコードは必要ありません。

関連する問題