40

実装されdoFilter()ました。Filter を jUnit で適切にカバーするには?

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws java.io.IOException, javax.servlet.ServletException
{
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String currentURL = request.getRequestURI();

    if (!currentURL.equals("/maintenance.jsp") && modeService.getOnline())
    {
        response.sendRedirect("/maintenance.jsp");
    }
    filterChain.doFilter(servletRequest, servletResponse);
}
4

3 に答える 3

40

ServletRequestServletResponseおよびFilterChainはすべてインターフェースであるため、手動またはモックフレームワークを使用して、それらのテストスタブを簡単に作成できます。

モックオブジェクトを構成可能getRequestURI()にして、sendRedirectが呼び出されたことをアサートするために、ServletResponseへの既定の応答を準備できるようにします。

模擬ModeServiceを注入します。

doFilterを呼び出して、モックのServletRequest、ServletResponse、およびFilterChainをパラメーターとして渡します。

@Test
public void testSomethingAboutDoFilter() {
    MyFilter filterUnderTest = new MyFilter();
    filterUnderTest.setModeService(new MockModeService(ModeService.ONLINE));
    MockFilterChain mockChain = new MockFilterChain();
    MockServletRequest req = new MockServletRequest("/maintenance.jsp");
    MockServletResponse rsp = new MockServletResponse();

    filterUnderTest.doFilter(req, rsp, mockChain);

    assertEquals("/maintenance.jsp",rsp.getLastRedirect());
}

実際には、セットアップを@BeforesetUp()メソッドに移動し、可能なすべての実行パスをカバーする@Testメソッドをさらに記述します。

...そして、仮想的なものなどではなく、おそらくJMockやMockitoなどのモックフレームワークを使用してモックを作成しMockModeServiceます。ここで使用しました。

これは、統合テストではなく、単体テストのアプローチです。テスト対象のユニット(およびテストコード)のみを実行しています。

于 2012-07-12T12:50:15.473 に答える
21

HttpServletRequest上記の、HttpServletResponseおよびFilterChainオブジェクトとその動作をモックするために、モック フレームワークを使用できます。フレームワークによっては、コードの実行中にモックされたオブジェクトに対して正しいアクションが実行されたかどうかを確認するための特定の機能があります。

たとえば、Mockitoモック フレームワークを使用する場合、提供されたdoFilter()メソッドは、以下のテスト ケースを使用して JUnit テストすることができます。

@Test
public void testDoFilter() throws IOException, ServletException {
    // create the objects to be mocked
    HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
    HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);
    FilterChain filterChain = mock(FilterChain.class);
    // mock the getRequestURI() response
    when(httpServletRequest.getRequestURI()).thenReturn("/otherurl.jsp");

    MaintenanceFilter maintenanceFilter = new MaintenanceFilter();
    maintenanceFilter.doFilter(httpServletRequest, httpServletResponse,
            filterChain);

    // verify if a sendRedirect() was performed with the expected value
    verify(httpServletResponse).sendRedirect("/maintenance.jsp");
}
于 2014-11-09T07:57:17.763 に答える