Java 带Servlet请求的Mockito单元测试的过滤器链

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

我使用Mockito测试过滤器,我尝试测试需要HTTPServlet请求作为参数的过滤器链方法,我尝试模拟Servlet请求和HTTPServlet请求,但我收到了 错误, 将HTTPServlet请求用作空指针异常时,&with 无法强制转换Servlet请求。任何线索都是感激的

我的过滤器看起来像

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之后,以及使用mockServletRequest
checkerFilter.doFilter(mockServletRequest、mockResponse、mockchain)应该可以工作的人我收到的
org.mockito.codegen.ServletRequest无法转换为javax.servlet.http.HttpServletRequest
。是否有任何解决强制转换问题的方法?使用HTTPServletRequest并模拟getMethod()的适当返回值,getContentType解决了空指针异常。