JUnit тестирование с мокито - PullRequest
       7

JUnit тестирование с мокито

1 голос
/ 24 сентября 2019

У меня есть этот класс фильтра, и мне нужно иметь максимально высокое покрытие кода при тестировании с 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() возвращает NullPointerException в

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

строке.

Как мне избежать этого?

Мне нужно вызвать этот метод и выполнить все, что находится внутри, чтобы обеспечить необходимое покрытие кода.

1 Ответ

1 голос
/ 24 сентября 2019

Проблема в том, что

HttpServletRequest request = (HttpServletRequest) servletRequest;

приводит к null , потому что вы передаете ServletRequest, который не будет приведен к HttpServletRequest

.введите, что вы пытаетесь привести его к тестируемому методу.

Например

//...

@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
    //...
}
...