当前位置: 首页 > 知识库问答 >
问题:

用mockito进行JUnit测试

拓拔泉
2023-03-14

我有这个过滤器类,在使用junit进行测试时需要尽可能高的代码覆盖率。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String userId= request.getHeader(Constants.USER_ID);

    if (StringUtils.isEmpty(userId)) {
        LOGGER.error("User Id is missing in request header.");
        isAuthorized = false;
    } 

    if (!isAuthorized) {
        LOGGER.warn("Authorization failed: User ID =[{}] is not authorized to access.", userId);
        response.setContentType("text/html; charset=UTF-8");
        response.getWriter().write(errorMsg);
    } else {
        filterChain.doFilter(request, response);
    }
}

和测试等级:

@RunWith(MockitoJUnitRunner.class)
public class SampleFilterTest {

    @Mock
    FilterConfig filterConfig;

    ServletRequest servletRequest;
    ServletResponse servletResponse;
    HttpServletRequest request;

    @Mock
    FilterChain filterChain;

    @Mock
    HttpServletResponse httpServletResponse;


    @InjectMocks
    SampleFilter sampleFilter;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void init() throws ServletException {
        sampleFilter.init(filterConfig);
    }

    @Test
    public void doFilter() throws IOException, ServletException{
        //when(request.getHeader(Constants.USER_ID)).thenReturn("batman");
        sampleFilter.doFilter(servletRequest, servletResponse, filterChain);
    }

    @Test
    public void destroy() {
        sampleFilter.destroy();
    }
}

当我运行doFilter()时,它在

String userId= request.getHeader(Constants.USER_ID);

线

我如何避免这种情况?

我需要调用这个方法并执行里面的任何内容来提供所需的代码覆盖。

共有1个答案

束建章
2023-03-14

问题在于

HttpServletRequest request = (HttpServletRequest) servletRequest;

正在强制转换为null,因为您传入了一个不会强制转换为HttpServletRequest的ServletRequest

在测试的方法中模拟要将其转换为的实际类型。

例如

//...

@Test
public void doFilter() throws IOException, ServletException {
    //Arrange
    //mock HttpServletResponse so cast does not fail
    ServletRequest request = mock(HttpServletRequest.class);
    when(request.getHeader(Constants.USER_ID)).thenReturn("batman");

    ServletResponse response = mock(HttpServletResponse.class);
    //setup response as neded. Looks like `.getWriter().write(errorMsg);` needs mocking

    //Act
    sampleFilter.doFilter(request, response, filterChain);

    //Assert
    //...
}
 类似资料:
  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

  • 问题内容: 这是从这个问题开始的:要求我在哪里开始一个新的问题。 问题是我只是对JUnit 或有关的东西之类的东西还不够了解,无法用Jeff Bowman提到的方式解决问题。 问题答案: 在您以后的评论中,我指出了差距:您需要使用Mockito作为规则,而将参数化为Runner,而不是相反。 原因是Runner负责报告测试数量,而Parameterized则根据测试方法的数量和参数化输入的数量来操

  • 我正在使用Mockito编写一个JUnit测试用例,并得到一个NullPointerException。 在我的代码中是这样的:

  • 我使用JUnit4和Mockito创建了一个Spring Boot2应用程序。当我测试某种方法时。会出现这样的例外: 这是我的测试代码 SuveryService.java SurveyRepository.java 我引用了这篇文章Mockito NullPointerException,但这个问题仍然存在。任何帮助都将被应用。

  • ...还有一个很简单的测试... 如果我在IntelliJ中运行这个,测试就会运行并失败。 如果我提交这个项目并将其推送到github,TeamCity会看到变化并开始构建。生成会很快失败,出现以下错误:

  • 我应该如何测试异常?我可以mock connector并且我可以赋予它抛出异常的行为,但是我不明白下一步该怎么做。