본문 바로가기

카테고리 없음

Spring MVC integration test

헤더 확인 테스트

아래와 같이 header에 대해 확인을 하는데 아래와 같이 헤더가 없다고 나온다.

// when
ResultActions result = mockMvc.perform(
        post("....") // ..

// then
result.andExpect(status().isCreated())
        .andExpect(header().string("location", "https://namocom.tistory.com/10101"));

아래와 같이 ResponseEntity 를 통해 create(..)를 사용하면 location 헤더가 나와야한다.

return ResponseEntity.created(uri).build();

왜냐하면 내부가 아래와 같이 구현이 되어 있기 때문이다.

public class ResponseEntity<T> extends HttpEntity<T> {
	// ..
	public static BodyBuilder created(URI location) {
		BodyBuilder builder = status(HttpStatus.CREATED);
		return builder.location(location);
	}

원인

전혀 생각하지 못했던 것이 테스트 실패의 원인이었다.

RFC 스펙상 헤더 이름은 대소문자를 구별해야 하나 구별하고 있지 않았기에 발생했던 문제였다.

아래와 같이 location 이 아닌 Location 로 바꾸니 Green으로 바뀌었다.

// when
ResultActions result = mockMvc.perform(
        post("....") // ..

// then
result.andExpect(status().isCreated())
        .andExpect(header().string("Location", "https://namocom.tistory.com/10101"));

헤더 내용 확인 방법 (원인 파악)

ResultActions 에 andDo 로 print()를 넘겨주면 결과가 찍힌다.

// when
ResultActions result = mockMvc.perform(
        post("....") // ..

// then
result.andExpect(status().isCreated())
        .andExpect(header().string("location", "https://namocom.tistory.com/10101"))
        .andDo(print());

여기에 있는 값으로 헤더 이름 때문이라는 것을 추측해볼 수 있었다.

리팩토링

매직 상수를 아래와 같이 리팩터링 한다면 더 좋을 것 같다.

// when
ResultActions result = mockMvc.perform(
        post("....") // ..

// then
result.andExpect(status().isCreated())
        .andExpect(header().string(HttpHeaders.LOCATION, "https://namocom.tistory.com/10101"));