有人可以帮我提供单元测试代码吗?我总是会收到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);
}
}
答案 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
对象并对其进行各种验证。