[스프링]단위 테스트 코드(2/2)

allnight5·2023년 1월 30일
0

스프링

목록 보기
41/62

controller와 repository에 단위테스트를할껀데

테스트는 다른 테스트메소드에 의존관계가 없어야한다.
테스트 코드 메소드는 각자 돌아갈 수 있어야한다.
예)회원가입없이 로그인/ 회원가입,로그인필요한데 없이 게시글작성 등

controller

@ExtendWith(MockitoExtension.class)
class UserControllerTest {

    @Mock
    private UserService userService;

    @InjectMocks
    private UserController userController;

    private MockMvc mockMvc;

    @BeforeEach
    public void init() {
        mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
    }

    @Test
    @DisplayName("회원가입 (성공)")
    void signup() throws Exception {
        // given
        SignupRequest request = SignupRequest.builder()
                .admin(false)
                .username("nathan")
                .password("1234qwer")
                .email("nathan@gmail.com")
                .build();

        ResponseStatusDto response = new ResponseStatusDto(StatusEnum.SIGN_SUCCESS);

        when(userService.signup(any(SignupRequest.class)))
                .thenReturn(response);

        // when
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders.post("/api/users/signup")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(new Gson().toJson(request)));

        // then
        resultActions.andExpect(status().isOk())
                .andExpect(jsonPath("statusCode", response.getStatusCode()).exists())
                .andExpect(jsonPath("msg", response.getMsg()).exists());
    }

    @Test
    @DisplayName("회원가입 (실패) - 아이디")
    void signup_failed_id() throws Exception {
        // given
        SignupRequest request = SignupRequest.builder()
                .admin(false)
                .username("nat")
                .password("1234qwer")
                .email("nathan@gmail.com")
                .build();

        // when
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders.post("/api/users/signup")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(new Gson().toJson(request))
        );

        // then
        resultActions.andExpect(status().isBadRequest());
    }

    @Test
    @DisplayName("회원가입 (실패) - 비밀번호")
    void signup_failed_pw() throws Exception {
        // given
        SignupRequest request = SignupRequest.builder()
                .admin(false)
                .username("nathan")
                .password("1234qwe")
                .email("nathan@gmail.com")
                .build();

        // when
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders.post("/api/users/signup")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(new Gson().toJson(request))
        );

        // then
        resultActions.andExpect(status().isBadRequest());
    } 
}

Repository

@DataJpaTest
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    @DisplayName("사용자 추가")
    void addUser() {
        // given
        User user = new User(
                "nathan",
                "1234qwer",
                "nathan@gmail.com",
                UserRoleEnum.USER
        );

        // when
        User savedUser = userRepository.save(user);

        // then
        assertThat(savedUser.getUsername()).isEqualTo(user.getUsername());
    }

    @DisplayName("사용자 조회")
    @Test
    void findByUsername() {
        // given
        User user = new User(
                "nathan",
                "1234qwer",
                "nathan@gmail.com",
                UserRoleEnum.USER
        );

        userRepository.save(user);

        // when
        Optional<User> savedUser = userRepository.findByUsername(user.getUsername());

        // then
        assertThat(savedUser).isPresent();
    }
}
profile
공부기록하기

0개의 댓글