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를 줄일 수 있고, 해당 코드가 작성된 목적을 명확하게 표현할 수 있다.
정상작동하는 코드부터, 오류가 날 코드까지 미리 다 테스트를 한다는데 아직 실제코드에 접목하기까지는 어려워 차근차근 만들어둔 프로젝트에 적용 연습을 해봐야 할 것 같다.
😈 아는 내용이라고 그냥 넘어가지 않기! 😈
'❤️🔥TIL (Today I Learned)' 카테고리의 다른 글
[TIL] 2023-01-31(64day) / JPA 심화(1) (0) | 2023.01.31 |
---|---|
[TIL] 2023-01-30(63day) / 알고리즘 (0) | 2023.01.30 |
[TIL] 2023-01-26(62day) / Unit Test(1) (0) | 2023.01.27 |
[TIL] 2023-01-25(61day) / 프로젝트(6day) (0) | 2023.01.25 |
[TIL] 2023-01-20(60day) / 프로젝트(5day) (0) | 2023.01.23 |
댓글