이전에 진행했던 프로젝트의 유저 서비스에서 회원 가입과 로그인 기능의 테스트코드를 작성해 보았다.
@ExtendWith(MockitoExtension.class)
class UserServiceImplTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserServiceImpl userService;
@Mock
private ProfileRepository profileRepository;
@Mock
private JwtUtil jwtUtil;
@InjectMocks
private SecurityConfig securityConfig;
@Mock
private PointRepository pointRepository;
@Spy
private BCryptPasswordEncoder passwordEncoder;
@Test
@DisplayName("회원 가입")
void signup() {
//given
SignupDto signupDto = SignupDto.builder().username("Lee1231").password("password1").nickname("LEE").build();
when(userRepository.findByUsername("Lee1231")).thenReturn(Optional.empty());
//when
String msg = userService.signup(signupDto);
//then
assertThat(msg).isEqualTo("회원가입 성공");
}
@Test
@DisplayName("로그인")
void login() {
//given
LoginUserRequestDto loginUserRequestDto = LoginUserRequestDto.builder().username("Lee1231").password("password1").build();
User user = User.builder().username("Lee1231").password(passwordEncoder.encode("password1")).role(UserRoleEnum.CUSTOMER).build();
MockHttpServletResponse servletResponse = new MockHttpServletResponse();
when(userRepository.findByUsername("Lee1231")).thenReturn(Optional.of(user));
when(jwtUtil.createToken(user.getUsername(),user.getRole())).thenReturn(any());
//when
String msg = userService.login(loginUserRequestDto,servletResponse);
//then
assertThat(msg).isEqualTo("로그인 성공");
}
}
테스트를 잘 통과하는 모습이다.
@Mock 과 @InjectMocks는 가짜 객체를 만들어 테스트하는데 사용하고, @spy는 실제 기능을 그대로 사용하여 테스트 할때 사용한다.
처음에는 JwtUtil을 @spy를 사용해 이용해 보려 했는데, jwtutil에서 만드는 key를 받아오지 못했다. 찾아보니 key를 만드는 메서드에 @PostConstruct가 선언되어 있었고, mokito에서는 이를 제대로 실행시켜주지 못해서 생기는 문제였다.
그런데 생각해보니 login()을 테스트 하는 목적이 정해진 값을 넣었을때, 목적에 대한 반환값을 반환해주는지 확인해 보는것인데, 굳이 토큰이 잘 만들어지는지 확인해줄 필요가 없다고 생각해서 @Mock을 붙여 테스트 해 주었다.
토큰이 잘 만들어지는 지 확인하려면 따로 JwtUtil 테스트 코드를 작성해야한다는 생각이 들었다.
'개발일지(일간)' 카테고리의 다른 글
23년 1월 30일 (0) | 2023.01.30 |
---|---|
23년 1월 27일 테스트코드 (0) | 2023.01.28 |
23년 01월 25일 (0) | 2023.01.25 |
23년 1월 20일 팀 프로젝트 (0) | 2023.01.21 |
23년 1월 19일 팀 프로젝트 (0) | 2023.01.19 |