Java 带Servlet请求的Mockito单元测试的过滤器链
我使用Mockito测试过滤器,我尝试测试需要HTTPServlet请求作为参数的过滤器链方法,我尝试模拟Servlet请求和HTTPServlet请求,但我收到了 错误, 将HTTPServlet请求用作空指针异常时,&with 无法强制转换Servlet请求。任何线索都是感激的 我的过滤器看起来像Java 带Servlet请求的Mockito单元测试的过滤器链,java,spring,unit-testing,Java,Spring,Unit Testing,我使用Mockito测试过滤器,我尝试测试需要HTTPServlet请求作为参数的过滤器链方法,我尝试模拟Servlet请求和HTTPServlet请求,但我收到了 错误, 将HTTPServlet请求用作空指针异常时,&with 无法强制转换Servlet请求。任何线索都是感激的 我的过滤器看起来像 public class CheckerFilter implements Filter { private final UserDetails userDetails; priate final
public class CheckerFilter implements Filter {
private final UserDetails userDetails;
priate final UserAuthentication userAuthentication
public CheckerFilter(UserDetails userDetails,UserAuthentication userAuthentication ){
this.userDetails = userDetails;
this.userAuthentication = userAuthentication;
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException{
final HttpServletRequest request = (HttpServletRequest)req;
final String method = request.getMethod();
final String contentType = request.getContentType();
boolean result = evaluate();
....
if(result)filter.doChain(request, res, chain);
else res.sendRedirect('\XXX');
}
}
public class CheckerFilterTest {
@InjectMocks private CheckerFilter checkerFilter;
final UserDetails userDetails =mock(UserDetails.class);
final UserAuthentication userAuthentication = mock (UserAuthentication.class);
@Mock ServletRequest mockServeletRequest;
@Mock ServletResponse mockResponse;
@Mock HTTPServeltRequest mockHttprequest;
public void setUp (){
checkerFilter = new CheckerFilter(userDetails, userAuthentication);
}
@Test
public void Evaluate_returnsTrue(){
when(evaluate()).thenReturn(true);
checkerFilter.doFilter(mockHTTPrequest, mockResponse, mockchain);
//Error denoting mockHTTPRequest as null pointer exception.
//checkerFilter.doFilter(mockServletrequest, mockResponse, mockchain);Error mentioning Servlet Request cannot be cast to HTTPServlet Request.
}
}
测试看起来像
public class CheckerFilter implements Filter {
private final UserDetails userDetails;
priate final UserAuthentication userAuthentication
public CheckerFilter(UserDetails userDetails,UserAuthentication userAuthentication ){
this.userDetails = userDetails;
this.userAuthentication = userAuthentication;
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException{
final HttpServletRequest request = (HttpServletRequest)req;
final String method = request.getMethod();
final String contentType = request.getContentType();
boolean result = evaluate();
....
if(result)filter.doChain(request, res, chain);
else res.sendRedirect('\XXX');
}
}
public class CheckerFilterTest {
@InjectMocks private CheckerFilter checkerFilter;
final UserDetails userDetails =mock(UserDetails.class);
final UserAuthentication userAuthentication = mock (UserAuthentication.class);
@Mock ServletRequest mockServeletRequest;
@Mock ServletResponse mockResponse;
@Mock HTTPServeltRequest mockHttprequest;
public void setUp (){
checkerFilter = new CheckerFilter(userDetails, userAuthentication);
}
@Test
public void Evaluate_returnsTrue(){
when(evaluate()).thenReturn(true);
checkerFilter.doFilter(mockHTTPrequest, mockResponse, mockchain);
//Error denoting mockHTTPRequest as null pointer exception.
//checkerFilter.doFilter(mockServletrequest, mockResponse, mockchain);Error mentioning Servlet Request cannot be cast to HTTPServlet Request.
}
}
模拟需要初始化。您可以在setup()方法中使用MockitoAnnotations.initMocks(this)来初始化@Mock annotated Mock。另外,您必须使用http servlet请求模拟,而不是servlet请求模拟,因为它不能在public void setUp()之前降级
>{MockitoAnnotations.initMocks(this);checkerFilter=new checkerFilter(userDetails,userAuthentication);}
您会这样引用吗?感谢在安装程序中添加initmock之后,以及使用mockServletRequestcheckerFilter.doFilter(mockServletRequest、mockResponse、mockchain)应该可以工作的人代码>我收到的org.mockito.codegen.ServletRequest无法转换为javax.servlet.http.HttpServletRequest
。是否有任何解决强制转换问题的方法?使用HTTPServletRequest并模拟getMethod()的适当返回值,getContentType解决了空指针异常。