본문 바로가기

개발일지(일간)

23년 1월 26일

이전에 진행했던 프로젝트의 유저 서비스에서 회원 가입과 로그인 기능의 테스트코드를 작성해 보았다.

@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