본문 바로가기
Study/Spring

Controller 통합 테스트 코드 | Spring Spring boot JPA Study

by M개발자 2022. 2. 12.
반응형

✔ Java 11

✔ Gradle 7

✔ Spring boot 2.6.3

통합 테스트란?

DB에 접근하거나 전체 코드와 다양한 환경이 제대로 작동하는지 확인하는데 필요한 모든 작업을 수행할 수 있다.

테스트 프레임워크로 JUnit을 사용했다.

 

1. 테스트 파일 생성

Controller 메소드 이름을 우클릭 후 Generate > Test를 눌러 테스트 파일을 자동으로 생성할 수 있다.

 

2. 테스트 파일 세팅

@Transactional
@SpringBootTest
class UserMinjControllerTest {

    private MockMvc mockMvc;
    @Autowired
    private WebApplicationContext context;

    @BeforeEach
    void setUp() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .build();
    }

}

@Transactional @Text 실행이 종료될 때마다 롤백한다.

@SpringBootTest 스프링 IoC, DB CRUD 사용하기 위해 선언한다.

MockMvc 테스트할 컨텍스트를 지정하기 위해 생성한다.

WebApplicationContext 테스트할 Application Context를 인젝션하기 위해 선언한다.

@BeforeEach 이 어노테이션을 붙인 메소드는 테스트 메소드가 실행되기 전 실행된다.

 

4. UserController 통합 테스트 코드 작성

UserController에 구현된 기능은 회원 생성 / 조회 / 상세 조회 / 정보 수정 / 삭제이다.

해당 기능이 정상적으로 돌아가는지와 예외 처리를 테스트 코드로 작성했다.

 

1. 회원 생성

// 회원이 정상적으로 생성된 경우 - 200 반환
@Test
void 회원_생성_200() throws Exception {
    UserRequestDto userRequestDto = new UserRequestDto("m0_0m", "password", "minj");

    mockMvc.perform(post("/users-minj") // http 메소드와 도메인 입력
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(new ObjectMapper().writeValueAsString(userRequestDto)))
            .andExpect(status().isOk())
            .andDo(print());
}

// 이미 존재하는 아이디일 경우 - 409 반환
@Test
void 회원_중복_409() throws Exception {
    UserRequestDto userRequestDto = new UserRequestDto("id001", "password", "minj");
    mockMvc.perform(post("/users-minj")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(new ObjectMapper().writeValueAsString(userRequestDto)))
            .andExpect(status().isConflict())
            .andDo(print());
}

perform() http 메소드와 도메인을 입력한다.

contentType 요청을 보낼 데이터의 형을 입력한다.

content 요청을 보낼 데이터를 입력한다.

andExpect 실행 결과를 검증하는 ResultMatcher를 지정한다.

  • status 기대하는 HTTP 상태 코드를 입력하여 검증한다.

andDo 인수에 실행 결과를 처리할 수 있는 ResultHandler를 지정한다.

  • print response값을 확인할 수 있다.

 

2. 회원 조회

// 회원 목록이 정상적으로 조회된 경우 - 200 반환
@Test
void 회원_목록_200() throws Exception {
    mockMvc.perform(get("/users-minj"))
            .andExpect(status().isOk())
            .andDo(print());
}

 

3. 회원 상세 조회

// 회원의 상세 정보가 성공적으로 조회된 경우 - 200 반환
@Test
void 회원_상세_조회_200() throws Exception {
    mockMvc.perform((post("/users-minj/1"))).andExpect(status().isOk()).andDo(print());
}

// 존재하지 않는 id를 조회한 경우 - 404 반환
@Test
void 회원_상세_조회_404() throws Exception {
    mockMvc.perform((post("/users-minj/1000"))).andExpect(status().isNotFound()).andDo(print());
}

 

print()를 사용하면 테스트를 돌릴 시 response를 확인할 수 있다.

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = [{"id":1,"userId":"id001","userPassword":"password","userName":"001"},{"id":2,"userId":"id002","userPassword":"password","userName":"002"}]
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

4. 회원 정보 수정

// 회원 정보가 성공적으로 수정된 경우 - 200 반환 
@Test
void 회원_정보_수정_200() throws Exception {
    UserUpdateRequestDto userUpdateRequestDto = new UserUpdateRequestDto("doremi", "minji");
    mockMvc.perform((post("/users-minj/1"))
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(new ObjectMapper().writeValueAsString(userUpdateRequestDto)))
            .andExpect(status().isOk())
            .andDo(print());
}

// 존재하지 않는 id를 수정한 경우 - 404 반환
@Test
void 회원_정보_수정_404() throws Exception {
    UserUpdateRequestDto userUpdateRequestDto = new UserUpdateRequestDto("doremi", "minji");
    mockMvc.perform((post("/users-minj/1000"))
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(new ObjectMapper().writeValueAsString(userUpdateRequestDto)))
            .andExpect(status().isNotFound())
            .andDo(print());
}

 

5. 회원 삭제

// 회원 삭제가 정상적으로 된 경우 - 200 반환
@Test
void 회원_삭제_200() throws Exception {
    mockMvc.perform((delete("/users-minj/1"))).andExpect(status().isOk()).andDo(print());
}

// 존재하지 않는 id를 삭제하려는 경우 - 404 반환
@Test
void 회원_삭제_404() throws Exception {
    mockMvc.perform((delete("/users-minj/1000"))).andExpect(status().isNotFound()).andDo(print());
}

 

테스트 완료

 

참고


회의록

반응형

댓글