[Spring] MockMvc 공부하자!!

YoungHo-Cha·2021년 9월 30일
25

Testing

목록 보기
6/7
post-thumbnail

오늘은 MockMvc에 대해서 공부를 해보자!

아마도 웹 개발을 하는 사람들은 자주 이용할거라고 생각한다!!


🚗목차

  • MockMvc란?
  • MockMvc 사용법
  • MockMvc 설정
  • MockMvc 메서드

MockMvc란?

MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.

다시 풀어서 이야기 하자.
내가 컨트롤러 테스트를 하고싶을 때 실제 서버에 구현한 애플리케이션을 올리지 않고(실제 서블릿 컨테이너를 사용하지 않고) 테스트용으로 시뮬레이션하여 MVC가 되도록 도와주는 클래스다!


🧐MockMvc 사용법

컨트롤러를 테스트한다고 가정하자!


class ControllerTest{
	
    @Autowired
    private MockMvc mockMvc; // mockMvc 생성
    
    @Test
    public void testController() throws Exception{
    	
        String jjson = "{\"name\": \"부대찌개\"}";
        
        //mockMvc에게 컨트롤러에 대한 정보를 입력하자.
        
        mockMvc.perform(
        get("test?query=food") //해당 url로 요청을 한다.
        .contentType(MediaType.APPLICATION_JSON) // Json 타입으로 지정
        .content(jjson) // jjson으로 내용 등록
        .andExpect(status().isOk()) // 응답 status를 ok로 테스트
        .andDo(print()); // 응답값 print
        )
        
        }
}
  1. MockMvc를 생성한다.
  2. MockMvc에게 요청에 대한 정보를 입력한다.
  3. 요청에 대한 응답값을 Expect를 이용하여 테스트한다.
  4. Expect가 모두 통과하면 테스트 통과
  5. Expect가 1개라도 실패하면 테스트 실패

🧐MockMvc 설정

MockMvc에 대한 설정들이 어떤게 있는지 살펴보자.

MockMvc는 각종 어노테이션을 지원한다.

🌈ContextHierychy

테스트용 DI 컨테이너 만들 때 Bean 파일을 지정한다.


@ContextHierarchy({
	@ContextConfiguration(classes = AppConfig.class),
    @ContextConfiguration(classes = WebMvcConfig.class)
})

🌈WebAppConfiguration

Controller 및 web 환경에 사용되는 빈을 자동으로 생성하여 등록

🌈단독 실행

	public class WelcomeControllerTest {
    MockMvc mockMvc;

    @Before
    public void setUpMockMvc() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(new WelcomeController()).build();
    }
}

"WelcomController"만 테스트한다는 의미이다. 단위 테스트에서 자주 쓰인다. 대상 Controller를 커스텀 할 수 있다.

🌈MockMvc 필터 추가

addFilter()로 필터를 추가할 수 있다.

class testt(){
	
    MockMvc mockMvc;
    
	@Before
	public void setUpMockMvc(){
		
  	  this.mockMvc = MockMvcBuilders
      					.standaloneSetup(TestController.class)
                        .addFilter(new SessionFilter()) //필터 추가
                        .build();
	{

}

🧐MockMvc 실행

🔎 MockMvc를 실행하는 방법을 알아보자.

perform()을 이용하여 설정한 MockMvc를 실행할 수 있다.


@Test
public void testController() throws Exception{
	mockMvc.perform(
        get("test?query=food")
        );
  • perform에 요청 설정 메서드를 통해성 요청에 대한 설정을 할 수 있다.

  • perform에 Expect 메서드를 통해서 테스트를 진행할 수 있다.


🧐MockMvc 요청 설정 메소드

MockMvc는 요청에 대한 설정을 할 수 있다.
🔎요청에 대한 설정을 알아보자.

  • param / params : 쿼리 스트링 설정

  • cookie : 쿠키 설정

  • requestAttr : 요청 스코프 객체 설정

  • sessionAttr : 세션 스코프 객체 설정

  • content : 요청 본문 설정

  • header / headers : 요청 헤더 설정

  • contentType : 본문 타입 설정

🌈코드 예시

@Test
public void testController() throws Exception{
	
    mockMvc.perforem(get("test"))
    	.param("query", "부대찌개")
        .cookie("쿠키 값")
        .header("헤더 값:)
        .contentType(MediaType.APPLICATION.JSON)
        .content("json으로");
}

🧐검증 메소드

방금 전에는 요청에 대한 설정 메소드를 보았다.
🔎이제 응답에 대한 검증 메소드를 살펴보자.

  • status : 상태 코드 검증

  • header : 응답 header 검증

  • content : 응답 본문 검증

  • cookie : 쿠키 상태 검증

  • view : 컨트롤러가 반환한 뷰 이름 검증

  • redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증

  • model : 스프링 MVC 모델 상태 검증

  • request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증

  • forwardedUrl : 이동대상의 경로 검증


@Test
public void testController() throws Exception{
	mockMvc.perform(get("test"))
    	.param("query", "부대찌개")
        .cooke("쿠키 값")
        .header("헤더 값:)
        .contentType(MediaType.APPLICATION.JSON)
        .content("json으로")
        .andExpect(status().isOk()) // 여기부터 검증
        .andExpect(content().string("expect json값"))
        .andExpect(view().string("뷰이름"));

위와 같이 하면

status 검증 -> conten 검증 -> view 검증 순으로 실시한다.

1개라도 통과되지 않으면 테스트는 fail 하게 된다.


🧐MockMvc 기타 메소드

요청 설정, 검증 설정 메소드가 아닌 기타 메소드도 존재한다.

  • andDo() : print, log를 사용할 수 있는 메소드

  • print() : 실행결과를 지정해준 대상으로 출력, default = System.out

  • log() : 실행결과를 디버깅 레벨로 출력, 레벨은 org.springframework.test.web.servlet.result


@Test
public void testController() throws Exception{
	
    mockMvc.perforem(get("test"))
    	.param("query", "부대찌개")
        .cookie("쿠키 값")
        .header("헤더 값:)
        .contentType(MediaType.APPLICATION.JSON)
        .content("json으로")
        
        .andExpect(status().isOk()) 
        .andExpect(content().string("expect json값"))
        .andExpect(view().string("뷰이름"))
        
        .andDo(print()) //여기부터 기타 메소드
        .andDo(log());

🧐속성 및 사용법 추가정리

🌈응답 생태코드

  • isOk() : 상태 코드가 200인지 확인
  • isNotFount() : 404인지 확인
  • isMethodNotAllowed() : 405인지 확인
  • isInternalServerError() : 500인지 확인
  • is(int status) : 임의로 지정한 상태 코드인지 확인

🌈모델 검증 속성

.andExpect(model().atrribute("userId", "fly123"))

  • attributeExists(String key) : key에 해당하는 데이터가 model에 있는지 검증

  • attribute(String key, Object value1) : key에 해당하는 value가 입력해준 "value1"과 일치한지 확인

🌈뷰 이름 검증

.andExpect(view().name("home"));

  • name(String viewName) : 응답된 뷰 이름이 viewName과 일치한지 확인

🌈리다이렉트 검증

.andExpect(redirectedUrl("/foodList?name=부대찌개"));


📋마치며

MockMvc를 새롭게 사용해보면서, 신세계를 느꼈다..
정말 한계가 없구나..

수많은 테스트를 앞으로 진행하게 될텐데 수많은 테스트 지원 객체들이 있을 것이다. 한편으로는 설레고 한편으로는 걱정된다..
구글 신 도와주세요 !!


🧷Reference

profile
관심많은 영호입니다. 궁금한 거 있으시면 다음 익명 카톡으로 말씀해주시면 가능한 도와드리겠습니다! https://open.kakao.com/o/sE6T84kf

4개의 댓글

comment-user-thumbnail
2022년 7월 15일

잘 읽었습니다.

답글 달기
comment-user-thumbnail
2022년 9월 14일

Github 링크가 잘못 걸려 있는것 같습니다. 404 error가 나오고 주소창에 아래의 url로 나옵니다.
https://github.com/https://github.com/Cha-Young-Ho

1개의 답글
comment-user-thumbnail
2022년 9월 14일

감사합니다..! 참조 레퍼런스에 올려놓은 링크들도 좋네요👍

답글 달기