如何对该doFilter()方法进行单元测试?

时间:2020-07-22 05:27:05

标签: java unit-testing junit mockito

有人可以帮我提供单元测试代码吗?我总是会收到Null Pointer Exception,因为MyFilter中的这段代码返回null

Request jettyRequest = Request.getBaseRequest(servletRequest);

代码

 public class MyFilter implements Filter {


  @Override
  public void init(final FilterConfig filterConfig) {
    LOG.info("My filter");
  }

  @Override
  public void doFilter(
      ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
      throws IOException, ServletException {
    final String startTime = String.valueOf(System.currentTimeMillis());

    Request jettyRequest = Request.getBaseRequest(servletRequest);
    String requestId = jettyRequest.getHeader(HttpHeaderUtils.APP_ID_HEADER);

    filterChain.doFilter(servletRequest, httpResponse);
  }

单元测试

public class MyFilterTest {

  private MockHttpServletRequest httpRequest;
  private MyFilter myFilter = new MediaRequestFilter(8888);

  @Before
  public void init() {
    httpRequest = new MockHttpServletRequest();
    httpRequest.addHeader(HttpHeaderUtils.REQUEST_ID_HEADER, 1);

    mediaRequestFilter.init(null);
  }

  @Test
  public void doFilterTest() throws IOException, ServletException {
    myFilter.doFilter(httpRequest, new MockHttpServletResponse(), new MockFilterChain());
    Assert.assertTrue(Long.valueOf(httpRequest.getHeader(HttpHeaderUtils.REQUEST_ID_HEADER)) > 0);
  }
}

1 个答案:

答案 0 :(得分:1)

我们可以使用间谍来协助您处理案件。您不能使用Mockito模拟静态方法。您可以使用PowerMockito来做到这一点,但我将向您展示另一种方式。

所以,我稍微改变了你的课。只是假设它仍然是您的代码。我刚刚添加了一个Request类,因为我不想真正地搜索该特定类。

@Slf4j
public class MyFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) {
        log.info("My filter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        Request jettyRequest = getBaseRequest(servletRequest);
        String requestId = jettyRequest.getHeader("Some header");

        log.info("Request id : {}", requestId);

        filterChain.doFilter(servletRequest, servletResponse);
    }

    Request getBaseRequest(ServletRequest servletRequest) {
        return Request.getBaseRequest(servletRequest);
    }

}

请注意,我将静态方法调用转换为实例方法调用,并使该方法成为 package-private 。我这样做是为了能够在我们的测试中访问它。

这是测试

@ExtendWith(MockitoExtension.class)
class MyFilterTest {

    @Test
    @SneakyThrows
    void testDoFilter() {
        final MyFilter myFilter = spy(new MyFilter());

        final ServletRequest req = mock(ServletRequest.class);
        final ServletResponse res = mock(ServletResponse.class);
        final FilterChain chain = mock(FilterChain.class);

        doReturn(new Request()).when(myFilter).getBaseRequest(req);

        myFilter.doFilter(req, res, chain);

        verify(chain).doFilter(req, res);
        verify(myFilter).getBaseRequest(req);
    }

}

我正在使用间谍来模拟对象的特定部分,即静态方法调用。而已。您可以模拟Request对象并对其进行各种验证。