H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • MockMvc를 이용한 컨트롤러 테스트
  • MockMvc 명령 정리
  • perform
  • andDo
  • andExpect
  • andReturn
  • MockMvc를 이용한 WebApplication 테스트
  • Standalone 테스트와 비교
  1. Web
  2. Back-end
  3. Spring Framework
  4. Spring Test

MockMvc Test

MockMvc를 이용한 컨트롤러 테스트

Spring과 연동하면 Spring Bean은 모두 테스트가 가능하다. 하지만 컨트롤러의 경우 요청과 존재해야 하며, 주입할 수 있는 객체가 아니기 때문에 테스트가 불가하다. Spring Test에서는 MockMvc 객체를 이용하여 가상의 요청을 만들고 그에 따른 실행 결과를 테스트 할 수 있다.

테스트 컨트롤러를 생성한다.

src/main/java : com.hakademy.spring11.controller.TestController

package com.hakademy.spring11.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
	
	@GetMapping("/test1")
	@ResponseBody
	public String test1() {
		return "test1 complete";
	}
	
}

이 컨트롤러가 정상적으로 작동하는지 테스트 하는 방법은 2가지가 있다.

  • 서버에 프로젝트를 올려 구동한 뒤 브라우저를 이용하여 확인한다.

  • MockMvc를 이용하여 테스트를 수행한다.

MockMvc를 이용하는 테스트 케이스를 생성한다.

src/test/java : com.hakademy.spring11.Test

package com.hakademy.spring11;

public class Test06 {

}

다른 Spring과 연동 없이 단독으로 TestController 하나만 테스트 하기 위해 StandAlone 형태로 MockMvc 인스턴스를 생성한다.

MockMvc mockMvc;

@Before
public void prepare() {
	mockMvc = MockMvcBuilders.standaloneSetup(new TestController()).build();
}

완성된 MockMvc 객체를 이용하여 테스트를 수행한다.

@Test
public void test() throws Exception {
	mockMvc.perform(get("/test1"))
					.andDo(print())
					.andExpect(status().is2xxSuccessful())
					.andReturn();
}

테스트 수행 시 다음과 같은 결과를 확인할 수 있다.

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /test1
       Parameters = {}
          Headers = {}

Handler:
             Type = com.hakademy.spring11.controller.TestController
           Method = public java.lang.String com.hakademy.spring11.controller.TestController.test1()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[14]}
     Content type = text/plain;charset=ISO-8859-1
             Body = test1 complete
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

MockMvc 명령 정리

MockMvc를 이용하여 테스트를 수행할 때 필요한 명령들은 다음과 같다.

  • .perform() : 요청을 수행하고 추가 조치를 수행할 수 있는 ResultActions 데이터 반환

  • .andDo() : 수행할 일반적인 행동을 설정합니다.

  • .andExpect() : 성공 상황을 설정(단정)합니다.

  • .andReturn() : 결과에 대한 정보들을 MvcResult 형태로 반환

perform

perform은 요청을 수행하기 위한 기본 명령이다. 내부에는 MockMvcRequestBuilders 클래스의 명령들을 사용하여 수행할 작업을 지정해줄 수 있다. MockMvcRequestBuilders는 static import로 생략이 가능하며 주요 명령으로는 다음과 같다.

  • get(url) : url에 대한 GET 방식의 요청을 수행

  • post(url) : url에 대한 POST 방식의 요청을 수행

  • put(url) : url에 대한 PUT 방식의 요청을 수행

  • delete(url) : url에 대한 DELETE 방식의 요청을 수행

  • patch(url) : url에 대한 PATCH 방식의 요청을 수행

요청 방식을 결정한 뒤에는 다음과 같이 추가 작업을 설정할 수 있다.

  • .param(name, value) : 요청 파라미터를 추가(name=value)

  • .accept(media) : accept 설정 수행

  • .characterEncoding(enc) : 요청 인코딩을 enc로 설정

  • .cookies(cks) : 요청에 쿠키를 추가

  • .contentType(type) : 요청의 MIME-TYPE을 type으로 설정

  • .requestAttr(name, value) : 요청에 Attribute를 추가

  • .session(mock) : 세션 추가

  • .sessionAttr(name, value) : 세션에 Attribute를 추가

  • .header(name, value) : 헤더 추가

  • .locale(locale) : 요청 언어 설정

andDo

andDo는 요청과 함께 수행할 작업을 지정할 때 사용한다. 사용할 수 있는 명령의 종류는 MockMvcResultHandlers에 정의되어 있으며 다음과 같다.

  • .print() : 지정된 대상에 메시지 출력

  • .log() : 로그 형태의 출력

andExpect

andExpect는 기대되는 상황에 대해서 정의할 때 사용한다. 복수개 설정이 가능하며, 상황에 맞지 않을 경우에는 테스트가 실패한다. 사용할 수 있는 명령의 종류는 MockMvcResultMatchers에 정의되어 있으며 다음과 같다.

  • .content() : Response Body를 검증할 때 사용

  • .cookie() : 쿠키를 검증할 때 사용

  • .flash() : Flash Attribute를 검증할 때 사용

  • .forwardedUrl(url) : forward된 URL이 url인지 검증할 때 사용

  • .forwardedUrlPattern(pattern) : forwared된 URL이 pattern 형태인지 검증할 때 사용

  • .handler() : 처리 핸들러를 검증할 때 사용

  • .header() : header를 검증할 때 사용

  • .redirectedUrl(url) : redirect된 URL이 url인지 검증할 때 사용

  • .redirectedUrlPattern(pattern) : redirect된 URL이 pattern 형태인지 검증할 때 사용

  • .request() : 요청을 검증할 때 사용

  • .status() : 상태를 검증할 때 사용

  • .view() : view를 검증할 때 사용

andReturn

andReturn은 테스트 수행 후 MvcResult 형태의 객체를 반환한다.

  • Request

  • Response

  • Exception

  • Interceptor

  • AsyncResult

등의 정보를 확인할 수 있다.

MockMvc를 이용한 WebApplication 테스트

Standalone 방식의 테스트로는 ViewResolver 등 연관된 기능들을 포함한 테스트를 구현하기 어렵다. 다음 매핑을 TestController에 추가한 뒤 테스트를 수행해서 원인을 찾아본다.

src/main/java : com.hakademy.spring11.TestController

@GetMapping("/test2")
public String test2() {
	return "test2";
}

@ResponseBody가 없기 때문에 반환값인 test2는 ViewResolver와 결합하여 /WEB-INF/views/test2.jsp로 인식되어야 한다. 테스트를 수행하여 정상적으로 처리되는지 확인해본다.

src/test/java : com.hakademy.spring11.Test07

package com.hakademy.spring11;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.hakademy.spring11.controller.TestController;

public class Test07 {
	
	MockMvc mockMvc;
	
	@Before
	public void prepare() {
		mockMvc = MockMvcBuilders.standaloneSetup(new TestController()).build();
	}
	
	@Test
	public void test() throws Exception {
		mockMvc.perform(get("/test2"))
						.andDo(print())
						.andExpect(status().is2xxSuccessful())
						.andReturn();
	}
	
}

테스트를 수행하면 오류가 발생하며, 오류 로그는 다음과 같이 나온다.

javax.servlet.ServletException: Circular view path [test2]: would dispatch back to the current handler URL [/test2] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

오류 메시지의 내용은 ViewResolver setup을 확인하라는 것이다. 즉, ViewResolver를 사용할 수 없다는 것인데, 이 때는 Spring의 환경과 연동한 테스트를 수행하여야 한다.

Spring과 연동한 테스트를 수행하고 싶을 경우 다음과 같이 테스트를 구성해야 한다.

src/test/java : com.hakademy.spring11.Test08

package com.hakademy.spring11;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {
	"file:src/main/webapp/WEB-INF/spring/root-context.xml",
	"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
})
public class Test08 {
	
	@Autowired
	WebApplicationContext context;
	
	MockMvc mockMvc;
	
	@Before
	public void prepare() {
		mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
	}
	
	@Test
	public void test() throws Exception {
		mockMvc.perform(get("/test2"))
						.andDo(print())
						.andExpect(status().is2xxSuccessful())
						.andReturn();
	}
	
}

수행하면 테스트가 성공함을 확인할 수 있다.

Standalone 테스트와 비교

Standalone 테스트에서의 변경사항을 확인해보면 다음과 같다.

스프링 환경과의 연동 설정을 수행한다.

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {
	"file:src/main/webapp/WEB-INF/spring/root-context.xml",
	"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
})

MockMvc에 환경정보를 설정하기 위해 WebApplicationContext 객체를 연결 생성한다.

환경이 연동되어 있을 때에만 자동 주입이 되므로 주의한다.

@Autowired
WebApplicationContext context;

MockMvc 객체를 생성할 때 .webAppContextSetup() 명령을 사용한다.

mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

위와 같이 처리할 경우 Spring 요청 처리의 대부분을 확인할 수 있으며, 처리 결과는 다음과 같다.

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /test2
       Parameters = {}
          Headers = {}

Handler:
             Type = com.hakademy.spring11.controller.TestController
           Method = public java.lang.String com.hakademy.spring11.controller.TestController.test2()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = test2
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {}
     Content type = null
             Body = 
    Forwarded URL = /WEB-INF/views/test2.jsp
   Redirected URL = null
          Cookies = []
PreviousSpring 환경 연동 테스트NextSpring AOP

Last updated 2 years ago