<aside> 1️⃣ 에러사항
</aside>
java.lang.NullPointerException: Cannot invoke "com.recipia.web.domain.user.User.getId()" because "entity" is null
@Autowired private SignUpService signUpService;
@MockBean private UserRepository userRepository;
@DisplayName("[happy] - 새로운 유저가 form 내용을 다 적고 회원가입을 시도하면 회원가입에 성공한다.")
@Test
void signUpUser() {
//given
User user = createUser();
SignUpUserRequest request = SignUpUserRequest.fromEntity(user);
//when
given(userRepository.save(user)).willReturn(user);
SignUpUserDto signUpUserDto = signUpService.signUpUser(request);
//then
assertThat(signUpUserDto).isNotNull();
assertThat(signUpUserDto).isInstanceOf(SignUpUserDto.class);
}
// id세팅은 없다.
private User createUser() {
return User.of(
"wlsdks12",
"wlsdks12",
"wlsdks12",
"[email protected]",
RoleType.ADMIN,
UserStatus.Y
);
}
@Slf4j
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class SignUpService {
private final UserRepository userRepository;
/**
* 새로운 유저가 회원가입을 하면 동작한다.
*/
@Transactional
public SignUpUserDto signUpUser(SignUpUserRequest request) {
// 1. request를 entity로 변환한다.
User user = User.fromRequest(request);
// 2. 정보를 db에 저장하고 dto로 변환해서 반환한다.
User savedUser = userRepository.save(user);
return SignUpUserDto.fromEntity(savedUser);
}
}
// id세팅은 없다.
private User createUser() {
return User.of(
"wlsdks12",
"wlsdks12",
"wlsdks12",
"[email protected]",
RoleType.ADMIN,
UserStatus.Y
);
}
private User createUser() {
return User.builder()
.id(1L)
.loginId("wlsdks12")
.password("wlsdks12")
.username("wlsdks12")
.userStatus(UserStatus.Y)
.email("[email protected]")
.roleType(RoleType.USER)
.build();
}
@DisplayName("[happy] - 새로운 유저가 form 내용을 다 적고 회원가입을 시도하면 회원가입에 성공한다.")
@Test
void signUpUser() {
//given
User user = createUser();
SignUpUserRequest request = SignUpUserRequest.fromEntity(user);
//when
// 여기만 바꿔줬다. any(User.class)로 바꿔줬다.
given(userRepository.save(any(User.class))).willReturn(user);
SignUpUserDto signUpUserDto = signUpService.signUpUser(request);
//then
assertThat(signUpUserDto).isNotNull();
assertThat(signUpUserDto).isInstanceOf(SignUpUserDto.class);
}
<aside> 1️⃣ 해결사항
</aside>
given(userRepository.save(user)).willReturn(user);
user
객체가 **userRepository.save()
**에 전달될 때만 **user
**를 반환하라"고 지시한다. 그렇기 때문에, 실제 서비스 코드에서 생성되는 새로운 User
객체와 **createUser()
**에서 생성된 user
객체가 동일한 참조를 갖지 않으면, Mockito는 **user
**를 반환하지 않는다.equals
메서드의 구현이 중요합니다. 테스트 코드에서 생성된 user
객체와 서비스 코드에서 생성된 User
객체가 동등성 검사에서 동일하다고 판단되지 않았기 때문에 given
구문이 예상대로 동작하지 않았던 것입니다.given(userRepository.save(any(User.class))).willReturn(user);
User
객체가 **userRepository.save()
**에 전달되더라도 항상 **user
**를 반환하도록 설정됩니다. 따라서 이 방식은 테스트 코드에서 원하는 동작을 얻기 위해 필요한 최소한의 설정을 제공한다.equals
메서드의 구현 방식과 Mockito의 동등성 검사 방식 사이에 미묘한 차이가 있었던 것으로 보인다.