1. Spring Boot 환경 설정
1-1. 테스트 환경
- Spring Boot 2.3.9.RELEASE
- JAVA 11
- Gradle
1-2. build.gradle
junit-jupiter-api
, junit-jupiter-params
, junit-jupiter-engine
사용 시에는 의존성 순서에 유의
junit-jupiter-api
는 무조건 셋 중 제일 위에 있어야 함
testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
와 같이 작성하거나, 셋 중 일부만 사용 가능
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.8.2")
testImplementation("org.junit.jupiter:junit-jupiter-params:5.8.2")
- Spring Boot 버전에 맞추어 5.5.2로 진행함
dependencies {
testImplementation("org.junit.platform:junit-platform-launcher:1.5.2")
testImplementation("org.junit.jupiter:junit-jupiter:5.5.2")
}
test {
useJUnitPlatform()
}
- build.gradle 우클릭 > Gradle > Refresh Gradle Project
1-3. JUnit5 라이브러리 추가
- 프로젝트 우클릭 > Build Path > Configure Build Path
- Libraries 탭 > Modulepath 선택 > Add Library
- JUnit 선택 > 셀렉트 박스에서 JUnit5 선택 > Finish
- Apply and Close
1-4. src/test/java
- 해당 폴더가 없으면 아래 과정 수행
- 프로젝트 우클릭 > new > other > 'Source Folder' 선택
src/test/java
입력 > Finish
src/main/java
의 패키지 구조에 맞추어 [프로젝트명]ApplicationTests.java
생성 및 아래와 같이 작성
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class [프로젝트명]ApplicationTests {
@Test
void contextLoads() {
}
}
2. 테스트 수행
[프로젝트명]ApplicationTests.java
우클릭 > Run As > JUnit Test
- 다음과 같이 정상 실행되는 것 확인
- 오류 발생 시 버전 문제일 가능성이 큼
2-1. UserController.java
@GetMapping(value = "/test.do")
public String test() {
return "test";
}
2-2. UserControllerTest.java
- @ExtendWith : JUnit5 확장 기능을 실행 시 사용
- SpringExtension : JUnit5를 위한 스프링 확장 기능(스프링 연동 테스트를 실행 가능하게 함)
- @WebMvcTest : Web(Spring MVC)에만 집중할 수 있는 어노테이션
- JPA 기능은 동작하지 않음
- @Controller, @ControllerAdvice 사용 가능
- @Service, @Repository 등 사용 불가
- 모두 사용하려면... @SpringBootTest 어노테이션으로 교체
- MockMvc : 웹 API 테스트 시 사용
- 스프링 MVC 테스트의 시작점
- HTTP GET,POST 등에 대한 API 테스트 가능
- 사용하려면... @AutoConfigureMockMvc 어노테이션 추가
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment=WebEnvironment.MOCK)
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
MockMvc mvc;
@BeforeEach
public void setup(){
mvc = MockMvcBuilders.standaloneSetup(new UserController())
.addFilters(new CharacterEncodingFilter("UTF-8", true))
.build();
}
@Test
void test() throws Exception {
String test = "test";
try {
final ResultActions actions = mvc.perform(get("/user/test.do")
.characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON));
actions
.andDo(print())
.andExpect(status().isOk());
} catch (Exception e) {
fail("FAILED");
}
}
}
- 실행
2-2-1. andExpert() 오류
.andExpect(content().string(test));
에 빨간줄 뜨는 오류
- the method andExpect(ResultMatcher) in the type ResultActions is not applicable for the arguments (RequestMatcher)
- (ResultMatcher) 추가하여
.andExpect((ResultMatcher) content().string(test));
로 작성하면, fail("FAILED");
가 실행된다.