본문 바로가기
💻 뚝딱뚝딱/북북클럽

[개발일지#002] 회원(User) 도메인 단위 테스트

by 뚜루리 2025. 4. 18.
728x90
320x100

🎯 오늘의 목표

  • 회원(User) 도메인 단위테스트

⚙️ 진행한 작업

  1. 회원(User) 도메인 단위테스트
    • 회원가입 성공
    • 로그인 실패
    • 회원정보수정

🛠️ 개발내용

📌 UserServiceTest

package ddururi.bookbookclub.domain.user.service;

import ddururi.bookbookclub.domain.user.dto.*;
import ddururi.bookbookclub.domain.user.entity.User;
import ddururi.bookbookclub.domain.user.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.Optional;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;

class UserServiceTest {
    @InjectMocks
    private UserService userService;

    @Mock
    private UserRepository userRepository;

    @Mock
    private BCryptPasswordEncoder passwordEncoder;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void 회원가입_성공() {
        // given
        UserSignupRequest request = new UserSignupRequest("test@example.com", "pw1234", "닉네임");

        when(userRepository.existsByEmail(request.getEmail())).thenReturn(false);
        when(passwordEncoder.encode(request.getPassword())).thenReturn("hashedPW");

        User savedUser = User.create(request.getEmail(), "hasedPw", request.getNickname());

        when(userRepository.save(any(User.class))).thenReturn(savedUser);

        // when
        UserResponse response = userService.signup(request);

        // then
        assertThat(response.getEmail()).isEqualTo("test@example.com");
        assertThat(response.getNickname()).isEqualTo("닉네임");
        verify(userRepository).save(any(User.class));
    }

    @Test
    void 로그인_실패_비밀번호불일치() {
        // given
        String email = "user@email.com";
        String rawPassword = "wrongPW";

        User user = User.create(email, "hashedPassword", "닉네임");

        when(userRepository.findByEmail(email)).thenReturn(Optional.of(user));
        when(passwordEncoder.matches(rawPassword, "hashedPassword")).thenReturn(false);

        // when & then
        assertThatThrownBy(() -> userService.login(new UserLoginRequest(email, rawPassword)))
                .isInstanceOf(IllegalArgumentException.class)
                .hasMessage("비밀번호가 일치하지 않습니다.");
    }

    @Test
    void 회원정보수정_성공() {
        // given
        Long userId = 1L;
        User user = User.create("user@email.com", "hashedPassword", "이전닉네임");
        user.setBio("이전 소개");

        when(userRepository.findById(userId)).thenReturn(Optional.of(user));

        UserUpdateRequest request = new UserUpdateRequest("새닉네임", "새 소개");

        // when
        userService.updateProfile(userId, request);

        // then
        assertThat(user.getNickname()).isEqualTo("새닉네임");
        assertThat(user.getBio()).isEqualTo("새 소개");
    }
}

 

 

📌 단위 테스트는 왜 서비스 중심으로 하나요?

 

[Spring] 단위 테스트에서 서비스 중심? 레파지토리 중심?

단위 테스트를 하다가 보니 문득 떠오른 궁금증이나, 이유를 정확히 몰랐던 것들 정리! 📌 단위 테스트를 할 때, 서비스 단을 테스트해야 하나요? 아니면 레포지토리를 테스트해야 하나요?“단

ddururiiiiiii.tistory.com

 

728x90
320x100