Тестирование фильтра токенов доступа - PullRequest
0 голосов
/ 13 июля 2020

Я создал создателя токена на предъявителя, и когда я пишу его тест, тест всегда терпит неудачу и возвращает nullPointerException, в чем проблема?

Примечание. Синтаксис токена на предъявителя похож на этот [Bearer {someEncodedCharacter}] .

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

@SpringBootTest
public class JwtTokenFilterTest {

  @MockBean
  private HttpServletRequest httpRequest;
  @MockBean
  private TokenManager tokenManagerTester;
  @MockBean
  private Authentication authentication;
  @MockBean
  private SecurityContext securityContext;
  @MockBean
  private HttpServletResponse httpResponse;
  @MockBean
  private FilterChain filterChain;
  @Test
  public void givenHttpServletRequestandHttpServletResponseandFilterChainDoFilterInternal()
      throws ServletException, IOException {
    String token="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhYmMxMjMiLCJpc3MiOiJ3d3cuYWJjLmNvbSIsImlhdCI6MTU5NDY0MTUzNywiZXhwIjoxNTk0NjQxODM3fQ.GHzVaQW_tvqo8HlDmoXzZ8WIYGcLHciLOSMFxsZUOsY";
    Mockito.when(httpRequest.getHeader("Authorization")).thenReturn("Bearer "+token);
    Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
    SecurityContextHolder.setContext(securityContext);
    Mockito.when(tokenManagerTester.tokenValidate(Mockito.anyString())).thenReturn(true);
    Mockito.when(tokenManagerTester
        .getUsernameToken(token))
        .thenReturn("abc123");


    JwtTokenFilter filter=new JwtTokenFilter();

    filter.doFilterInternal(httpRequest, httpResponse, filterChain);
    Mockito.verify(filterChain,Mockito.times(1));

  }


}

Вот JwtfFilter:

@Component
public class JwtTokenFilter extends OncePerRequestFilter {



    @Autowired
    private TokenManager tokenManager;

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest,
                                    @NotNull HttpServletResponse httpServletResponse,
                                    @NotNull FilterChain filterChain) throws ServletException, IOException {

        /**
         * We are parsing our token in two pieces and we process the second
         * "Bearer hvs231asas2355"
         */
        final String authHeader = httpServletRequest.getHeader("Authorization");
        /* */
        String username = null;
        String token = null;


        if (authHeader != null && authHeader.contains("Bearer")) {
            token = authHeader.substring(7);
            try {
                username = tokenManager.getUsernameToken(token);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            if (tokenManager.tokenValidate(token)) {
                UsernamePasswordAuthenticationToken upassToken =
                        new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
                upassToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));
                SecurityContextHolder.getContext().setAuthentication(upassToken);
            }
        }

        filterChain.doFilter(httpServletRequest, httpServletResponse); 
    }
}

Примечание 2: я думаю, что если я управляю filterChain.dofilter, я вижу, что метод работает правильно. По этой причине я написал Mockito.verify (filterChain, Mockito.times (1));

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Проблема в том, что я использовал MockBean вместо Mock.

  private static HttpServletRequest httpRequest;

  private static TokenManager tokenManagerTester;

  private static Authentication authentication;

  private static SecurityContext securityContext;

  private static HttpServletResponse httpResponse;

  private static FilterChain filterChain;
  @BeforeClass
  public static void setUp(){
    httpResponse = mock(HttpServletResponse.class);
    filterChain=mock(FilterChain.class);
    securityContext=mock(SecurityContext.class);
    authentication=mock(Authentication.class);
    tokenManagerTester=mock(TokenManager.class);
    httpRequest=mock(HttpServletRequest.class);
  }
0 голосов
/ 13 июля 2020

Отсутствует аннотация @ SpringBootTest или @ WebMvcTest в верхней части тестового класса. Вот почему компоненты зависимостей не издеваются в Spring.

Или вы можете использовать Mockito:

@RunWith(MockitoJUnitRunner.class)
public class JwtTokenFilterTest {

  @Mock
  private HttpServletRequest httpRequest;
  @Mock
  private TokenManager tokenManagerTester;
  @Mock
  private Authentication authentication;
  @Mock
  private SecurityContext securityContext;
  @Mock
  private HttpServletResponse httpResponse;
  @Mock
  private FilterChain filterChain;
  
  @InjectMocks
  private JwtTokenFilter filter=new JwtTokenFilter();
  
  @Test
  public void givenHttpServletRequestandHttpServletResponseandFilterChainDoFilterInternal()
      throws ServletException, IOException {
    String token="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhYmMxMjMiLCJpc3MiOiJ3d3cuYWJjLmNvbSIsImlhdCI6MTU5NDY0MTUzNywiZXhwIjoxNTk0NjQxODM3fQ.GHzVaQW_tvqo8HlDmoXzZ8WIYGcLHciLOSMFxsZUOsY";
    Mockito.when(httpRequest.getHeader("Authorization")).thenReturn("Bearer "+token);
    Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
    SecurityContextHolder.setContext(securityContext);
    Mockito.when(tokenManagerTester.tokenValidate(Mockito.anyString())).thenReturn(true);
    Mockito.when(tokenManagerTester
        .getUsernameToken(token))
        .thenReturn("abc123");
    filter.doFilterInternal(httpRequest, httpResponse, filterChain);
    Mockito.verify(filterChain,Mockito.times(1));

  }


}
...