@Mock
: Mock 객체를 만들어 반환해주는 어노테이션
@InjectMocks
: 생성된 가짜 객체를 자동으로 주입시켜주는 어노테이션
@Spy
: Stub하지 않은 메소드들은 원본 그대로 사용하는 어노테이션
@Test
@DisplayName("유저 회원가입")
void signupUser() {
// Request에서 받아오는 값 지정
// given builder는 가져오는 request에 @builder와 @AllArgsConstructor가 항상 같이 있어야한다.
UserSignupRequest request = UserSignupRequest.builder()
.username("user1")
.nickname("유저1")
.password("qweQWE123!@#")
.build();
// 유저네임 중복 확인
// when ~ .thenReturn ~ : 어떤 상황에서 Mock 객체가 어떤 값을 리턴하도록 만들어줌
// 가짜객체인 UserRepository에서 findByUsername으로 어떤 값이 리턴되는지
when(userRepository.findByUsername(any(String.class))) // 가짜 객체에 들어가는 인자를 아무 값이나
.thenReturn(Optional.empty()); // findByUsername이 옵셔널이라서
// 회원 중복 확인에서 레퍼지토리에서 username으로 찾아온 값이 empty여야하므로
// 닉네임 중복 확인
when(userRepository.findByNickname(any(String.class)))
.thenReturn(Optional.empty());
// when
userService.signupUser(request);
// then
verify(userRepository.save(new User("user1", "유저1", "qweQWE123!@#")));
// isA 어떤 클래스가 들어갈건지
// any는 불확정한 값
// verify(userRepository, times(1)).save(isA(User.class));
}