본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2023-01-27(63day) / Unit Test(2)

by elicho91 2023. 1. 29.

Controller, Repository Unit Test(2)


👉 Controller Test

package com.sparta.blogproject.user.controller;

import com.google.gson.Gson;
import com.sparta.blogproject.user.dto.ResponseStatusDto;
import com.sparta.blogproject.user.dto.SignupRequest;
import com.sparta.blogproject.user.dto.StatusEnum;
import com.sparta.blogproject.user.service.UserService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@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());
    }

    @Test
    void login() {
    }
}

 

👉 Repository Test

package com.sparta.blogproject.user.repository;

import com.sparta.blogproject.user.entity.User;
import com.sparta.blogproject.user.entity.UserRoleEnum;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.util.Optional;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.*;

@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();
    }
}

🙋‍♂️ 소감 : 

실제 현업에서 테스트코드를 작성하고 테스트하는데 많은 시간을 소모한다고 한다.
코드의 안정성을 높일 수 있고, 기능을 추가하거나 변경하는 과정에서 발생할 수 있는 Side-Dffect를 줄일 수 있고, 해당 코드가 작성된 목적을 명확하게 표현할 수 있다.
정상작동하는 코드부터, 오류가 날 코드까지 미리 다 테스트를 한다는데 아직 실제코드에 접목하기까지는 어려워 차근차근 만들어둔 프로젝트에 적용 연습을 해봐야 할 것 같다.

😈 아는 내용이라고 그냥 넘어가지 않기! 😈

댓글