쌩로그

Mockito로 Test작성 시 given.willReturn에 void 적용할 때 본문

Spring/Spring & Spring Boot

Mockito로 Test작성 시 given.willReturn에 void 적용할 때

.쌩수. 2023. 7. 23. 12:14
반응형

목록

  1. 포스팅 개요
  2. 본론
  3. 요약

1. 포스팅 개요

제 곧 내이다.

Rest Docs를 이용하다가 given.willReturn을 사용하는데, void일 때 어떻게 해야되는지 찾아보았고,
이를 간단하게 기록하고, 기억하려고 포스팅을 하게되었다.

2. 본론

정말 간단하다.

willDoNothing() 혹은, doNothing()을 사용하면된다.

doNothing()Mockito 라이브러리를 이용한 방식이고,
willDoNothing()Mockito를 확장한 BDDMockito 라이브러리를 이용한 방식이다.

doNothing()은 조금은 레거시적인 방법이다.

//        willDoNothing().given(tokenService).verificationLogOutToken(Mockito.any(HttpServletRequest.class));  
//        doNothing().when(tokenService).verificationLogOutToken(Mockito.any(HttpServletRequest.class));

다음은 willDoNothing()doNothing()으로 똑같은 메서드를 각각의 방식으로 Mocking하는 코드를 작성한 것이다.
보다시피 둘의 차이는 거의 없다.

주로 반환 타입이 없는 void 메서드에 대한 Mocking에 이용된다.


✅참고로 지금 코드는 다음과 같다.
해당 프로젝트는 Token을 이용하는 메서드는 요청이 들어올 때마다 해당 토큰이 blacklist로 된 Token인지 아닌지를 판별하기 위해 TokenService클래스의 verificationLogOutToken()이라는 로그아웃 토큰인지를 검증하는 메서드의 매개변수로 request를 넘겨주었고,
넘겨준 request에서 Token을 추출해 Redis로 로그아웃 토큰인지 아닌지를 검증하게 했다.
아무 일이 일어나지 않으면, 그대로 통과된다.
해당 메서드는 반환타입이 void이다.

// AccessToken 블랙리스트 검증  
    // Logout한 유저라면, 해당토큰을 가졌을 때, 사용하지 못 하도록 예외 발생해야한다.  
// 액세스 토큰에서 email 추출 => Principal로 하려해봤자, 인증되지 않은 토큰이라면 그 전에 예외처리 발생하므로,  
// 아예 해당 메서드에서 모든 로직 처리해야 됨.  
public void verificationLogOutToken(HttpServletRequest request) {  
    // 액세스 토큰  
    String accessToken = request.getHeader("Authorization").replace("Bearer ", "");  

    // 토큰에서 email 추출  
    String email = jwtTokenizer.getClaims(accessToken, jwtTokenizer.encodeBase64SecretKey(jwtTokenizer.getSecretKey())).getBody().getSubject();  

    // RedisUtils에서 LogoutToken을 얻어온다.  
    String blackListAccessToken = redisUtils.getData(email + ":logOut");  

    // 블랙리스트 토큰과 Header에 있는 토큰을 비교한다. // 같으면 에러 발생  
    if(accessToken.equals(blackListAccessToken)) {  
        throw new CustomLogicException(ExceptionCode.LOGOUT_TOKEN);  
    } // else는 필요없음. null이면 통과.  
}

willDoNothing()

willDoNothing().given(tokenService).verificationLogOutToken(Mockito.any(HttpServletRequest.class));  

willDoNothing()은 다음과 같다.
willDoNothing().given(클래스).메서드(매개변수 타입(모키토)) 와 같이 사용하면 된다.

doNothing()

doNothing().when(tokenService).verificationLogOutToken(Mockito.any(HttpServletRequest.class));

doNothing()은 다음과 같다.
doNothing().when(클래스).메서드(매개변수 타입(모키토)) 와 같이 사용하면 된다.

3. 요약

Mockito를 이용한 테스트 코드 작성시 반환타입이 void인 메서드를 Mocking 할 때 어떤 메서드를 사용하면 되는지에 대한 간단한 정리였다.

어쩌다보니 토큰 검증 메서드도 적게 되었다.;;;

728x90
Comments