본문 바로가기

Spring실습

spring boot에서 test code 작성(TDD, Junit)(실습)

반응형

 

지난 글에 이어서 이번에는 실습시간을 가져보겠습니다.

https://pinlib.tistory.com/entry/spring-boot%EC%97%90%EC%84%9C-test-code-%EC%9E%91%EC%84%B1TDD-Junit

 

spring boot에서 test code 작성(TDD, Junit)

이번엔 이론편으로 돌아왔습니다. 제가 현재 spring boot를 통해 제작중인 서버를 만드는데 있어서 이제는 test code를 제작할 필요가 생겼다는 판단으로 test code 제작 방법을 공부하고 있습니다. Sprin

pinlib.tistory.com

 

우선 기존에 만들었던 UserController.java에 대한 test code 작성방법부터 알아보겠습니다.

@WebMvcTest(UserController.class) 
@AutoConfigureWebMvc 
public class UserControllerTest {

@WebMvcTest의 경우 test하고자 하는 class를 parameter로 넣으면 됩니다.

@AutoConfigureWebMvc의 경우 추후에 사용할 MockMvc를 Builder없이 주입할 수 있게 도와줍니다.

@Autowired
private MockMvc mockMvc;

Autowired를 이용하여 MockMvc의 DI를 주입합니다.

 

@MockBean 
UserServiceImpl userService;

UserController에서 잡고 있는 Bean object에 대해 Mock 형태의 object를 생성하여 UserControllerTest에서 UserServiceImpl code를 이용할 수 있게 도와줍니다.

 

@Test 
@DisplayName("user data get test")  
void getUserTest() throws Exception {
    
    given(userService.adminSearchUser("testid")).willReturn( 
            List.of(
                    new UserDTO("testid3", "testpassword", "testname", "test@mail", 25)
            )
    );

    String userId = "testid";

    mockMvc.perform(get("/variable/" + userId))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$[0].userId").exists()) 
            .andExpect(jsonPath("$[0].userPassword").exists()) 
            .andExpect(jsonPath("$[0].userName").exists())
            .andExpect(jsonPath("$[0].userEmail").exists())
            .andExpect(jsonPath("$[0].userAge").exists())
            .andDo(print()); 

    verify(userService).adminSearchUser("testid");
}

우선 우리는 기존에 만들었던 method였던 userId를 입력하면 해당 user에 대한 db값을 불러오는 method를 test 할 겁니다.

 

@Test의 경우 test를 해야 하는 하나의 주체마다 @Test annotation을 달아줍니다.

 

@DisplayName은 debuggin을 할 때 가시성을 높여주는 annotation입니다.

 

given의 경우 Mockito에서 가져오는 library로 Mock object가 특정한 상황해서 해야하는 행위를 정의하는 method로 

어떠한 상황이 주어진다면? 정도로 해석하시면 됩니다.

* Mockito의 경우 Mock object를 생성하는 것을 도와주고 이를 사용하는데 있어서 도움을 주는 library입니다.

 

willReturn의 경우 이런상황이 발생할 것이다? 정도로 해석하시면 되고 

기존의 userService.adminSearchUser가 List 형태의 UserDTO를 반환하기 때문에 willReturn값 역시 동일하게 반환할 수 있도록 설계하면 됩니다.

 

andExpect의 경우 기대하는 값이 나왔는지 check 해 볼 수 있는 method입니다.

.andExpect(jsonPath("$[0].userPassword").exists())

해당 code를 해석해보자면

json값으로 각각의 값들을 받아온 후에 $.'변수' 를 이용하여 json의 key값을 받아옵니다.

 

.andDo(print());

해당 code의 경우 .andExpect를 통해 받아온 값들을 출력하는 code입니다.

 

verify의 경우 해당 object의 method가 잘 실행되었는지 check하는 code입니다.

 

 

 

이번에는 userDB를 생성하는 method를 test하는 code를 보겠습니다.

@Test
@DisplayName("user data post test")
void makeUserTest() throws Exception {
    given(userService.saveUser("testid2","testpassword","testname","test@mail",21)).willReturn(
            new UserDTO("testid2","testpassword","testname","test@mail",21));

    UserDTO userDTO = UserDTO.builder().userId("testid2").userPassword("testpassword").userName("testname").userEmail("test@mail").userAge(21).build();
    
    String json = new ObjectMapper().writeValueAsString(userDTO);

    mockMvc.perform(
            post("/user/join")
                    .content(json) 
                    .contentType(MediaType.APPLICATION_JSON)) 
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.userId").exists())
            .andExpect(jsonPath("$.userPassword").exists())
            .andExpect(jsonPath("$.userName").exists())
            .andExpect(jsonPath("$.userEmail").exists())
            .andExpect(jsonPath("$.userAge").exists())
            .andDo(print());

    verify(userService).saveUser("testid2","testpassword","testname","test@mail",21);
}

해당 code에서 

UserDTO userDTO = UserDTO.builder().userId("testid2").userPassword("testpassword").userName("testname").userEmail("test@mail").userAge(21).build();

의 경우 build를 통해서 dto object를 만듭니다.

 

String json = new ObjectMapper().writeValueAsString(userDTO);

해당 code의 경우 userDTO object를 json 형태로 전환합니다.

 

.content(json) 
.contentType(MediaType.APPLICATION_JSON))

1줄은 어떤 body값을 넘겨줄지 정합니다.

APPLICATION_JSON의 경우 일반적으로 json형태를 사용할때 사용합니다.

 

해당 code를 돌려보시면

전에 display annotation에서 가시성을 높인 것처럼

위와 같이 선택해서 보실 수 있습니다.

 

 

 

반응형