전에 만든 개인 프로젝트에서는 controller 테스트 코드를 작성하지 않았다. 대신 PostMan으로 하나하나 테스트를 했었다. 보다 안정적인 애플리케이션을 위해 이번 협업 프로젝트에서는 Controller 테스트 코드를 작성해보았다.
@WebMvcTest(controllers = MemberController.class)
class MemberControllerTest {
@SpringBootTest
는 모든 빈을 로드한다. 따라서 Controller 레이어만 테스트 하고 싶다면 @WebMvcTest
를 사용하는 것이 좋다.MockMvc mvc;
@BeforeEach
public void setup() {
this.mvc = MockMvcBuilders.webAppContextSetup(context)
.addFilter(new CharacterEncodingFilter("UTF-8", true))
.alwaysDo(print())
.build();
}
@Autowired
로 실행하면 한글 깨짐 현상이 발생해서 별도로 설정해주었다.
MockMvc mvc;
@MockBean
MemberService memberService;
Mockito
나 BDDMockito
를 사용하여 원하는 행위를 할 수 있도록 정의할 수 있다.AlcoholDetailsDto alcoholDetails = AlcoholDetailsDto.of(
alcohol, alcohol.getFileName(), "3", List.of(), List.of(), true);
given(alcoholService.getAlcoholDetails(anyLong(), anyLong()))
.willReturn(alcoholDetails);
//given
MockHttpSession session = new MockHttpSession();
session.setAttribute(SessionConst.LOGIN_MEMBER, new LoginMember(1L, "nickname"));
//when
//then
mvc.perform(patch("/reviews/0/edit")
.session(session)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.characterEncoding("UTF-8")
.content("{\"grade\" : 3, \"content\" : \"테스트 댓글\"}"))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.status").value("400"))
.andExpect(jsonPath("$.message").value("리뷰 고유 번호는 0보다 커야합니다."));
1) perfom()
2) andExcept()
andExcept(view().name("/detailpage"))
redirectedUrl("/where")
;model().attribute("alcoholDetails", alcoholDetails)
model().attributeHasFieldErrorCode("loginForm", "userId", "NotBlank")
jsonPath("$.status").value("400")
3) andDo()