헤더 확인 테스트
아래와 같이 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"));