Java Mocking Static Method

song yuheon·2023년 9월 23일
0

Trouble Shooting

목록 보기
14/57
post-thumbnail

문제



원인


@Component
public class SecurityUtil {
    public static Optional<User> getPrincipal() {
        // of() 인자로서 null 값을 받지 않는다.
        // ofNullable() null 값을 허용한다.
        return Optional.of(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(UserDetailsImpl.class::cast)
                .map(UserDetailsImpl::getUser); // 형태를 바꾼다. 생성자가 존재할것이다.
    }
}

SecurityUtil의 getPrincipal 메서드가 static으로 선언되어 있어서 오류가 발생 하였다.
static 메서드는 Mockito를 사용하여 직접 모킹할 수 없다.

-> MockStatic을 사용해야 한다.


해결


  1. 의존성 추가
    프로젝트의 build.gradle 파일에 Mockito의 버전을 3.4.0 이상으로 설정해야 한다.
testimplementation 'org.mockito:mockito-inline:5.2.0'
  1. **MockStatic 사용
    • SecurityUtil의 정적 메서드를 모킹하기 위해 MockedStatic<SecurityUtil> 타입의 변수를 선언한다.
    • 이 변수는 테스트 메서드의 시작 전에 초기화되고 테스트 메서드 종료 후에 닫혀야 한다.
    • beforeAllafterAll 어노테이션을 사용하여 초기화와 종료 로직을 구현할 수 있다.
private static MockedStatic<SecurityUtil> mockedSecurityUtil;

@BeforeAll
public static void setUp() {
    mockedSecurityUtil = mockStatic(SecurityUtil.class);
}

@AfterAll
public static void tearDown() {
    mockedSecurityUtil.close();
}
  1. 정적 메서드 모킹
    • given()을 사용하여 SecurityUtil의 정적 메서드의 반환 값을 모킹할 수 있다.
given(securityUtil.getPrincipal()).willReturn(Optional.ofNullable(securityUser));

profile
backend_Devloper

0개의 댓글