회원가입 서비스 로직을 테스트하기 위해 테스트코드를 작성하는 과정에서 마주친 문제이다.
현재 로직을 보면 다음과 같다. 즉, 정적 메서드가 두개가 사용되고 있는 상태이다.
이러한 코드 구조때문에 테스트하기 어려워졌다.
그 이유는 Mockito와 같은 mocking 라이브러리에서는 객체(Object)를 mocking하는데, 정적 메서드는 인스턴스와 무관하게 클래스 로딩 시점에 메모리에 올라간 코드이기 때문에 Spring의 DI 컨테이너나 Mockito의 mock() 방식은 작동하지 않는다.
따라서 다음과 같은 해결법을 생각해 보았다.
public class PasswordUtil {
public static String hashPassword(String plainPassword) {
return BCrypt.hashpw(plainPassword, BCrypt.gensalt());
}
public static boolean isSamePassword(String plainPassword, String hashedPassword) {
return BCrypt.checkpw(plainPassword, hashedPassword);
}
}
이는 비밀번호와 관련된 코드들이 모여있는 유틸 클래스이다.
여기에 속해있는 두개의 정적 메서드에서 static 키워드를 없앤 후 DI를 이용하여 메서드를 호출하는 방식을 통해 Mocking을 가능하게 하며, 테스트코드 작성을 용이하게 만드는 방식으로 변경할 수 있다.
@Component
public class PasswordUtil {
public String hashPassword(String plainPassword) {
return BCrypt.hashpw(plainPassword, BCrypt.gensalt());
}
public boolean isSamePassword(String plainPassword, String hashedPassword) {
return BCrypt.checkpw(plainPassword, hashedPassword);
}
}
여기서 util이라는 클래스명을 너무 남발하는게 아닌가 싶은 생각이 들었다.
그래서 나만의 util을 붙이는 기준을 만들고자 한다.