@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을 사용해야 한다.
build.gradle
파일에 Mockito의 버전을 3.4.0 이상으로 설정해야 한다.testimplementation 'org.mockito:mockito-inline:5.2.0'
SecurityUtil
의 정적 메서드를 모킹하기 위해 MockedStatic<SecurityUtil>
타입의 변수를 선언한다.beforeAll
과 afterAll
어노테이션을 사용하여 초기화와 종료 로직을 구현할 수 있다.private static MockedStatic<SecurityUtil> mockedSecurityUtil;
@BeforeAll
public static void setUp() {
mockedSecurityUtil = mockStatic(SecurityUtil.class);
}
@AfterAll
public static void tearDown() {
mockedSecurityUtil.close();
}
given()
을 사용하여 SecurityUtil
의 정적 메서드의 반환 값을 모킹할 수 있다.given(securityUtil.getPrincipal()).willReturn(Optional.ofNullable(securityUser));