[JUnit5] Spring Boot, Gradle 환경에서 JUnit5 적용, 테스트 실행하기

EUN JY·2022년 2월 14일
2

JAVA

목록 보기
5/7
post-thumbnail

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 {
	// JUnit5
    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(){
		// UserController를 MockMvc 객체로
		mvc = MockMvcBuilders.standaloneSetup(new UserController())
				.addFilters(new CharacterEncodingFilter("UTF-8", true))
				.build();
	}
	
	@Test
	void test() throws Exception {
		//given
        String test = "test";
        
        try {

        	//when
	        final ResultActions actions = mvc.perform(get("/user/test.do") // MockMvc를 통해 해당 주소로 GET 요청
	        		.characterEncoding("UTF-8")
	        		.contentType(MediaType.APPLICATION_JSON) 
	        		.accept(MediaType.APPLICATION_JSON));

	        //then
			actions
				    // mvc.perform()의 결과를 검증
					.andDo(print())
				    .andExpect(status().isOk()); // 200 상태
		} 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"); 가 실행된다.
    • e.getMessage() 값
       _org.opentest4j.AssertionFailedError: FAILED :: class org.springframework.test.web.client.match.ContentRequestMatchersLambda$1626/0x00000008009cf960 cannot be cast to class org.springframework.test.web.servlet.ResultMatcher (org.springframework.test.web.client.match.ContentRequestMatchersLambda1626/0x00000008009cf960andorg.springframework.test.web.servlet.ResultMatcherareinunnamedmoduleofloader 
      ′
      app 
      ′
      )atorg.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:39)atorg.junit.jupiter.api.Assertions.fail(Assertions.java:109)atcom.eunjy.stockid.controller.user.UserControllerTest.test(UserControllerTest.java:59)atjava.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atjava.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)atjava.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atjava.base/java.lang.reflect.Method.invoke(Method.java:564)atorg.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)atorg.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)atorg.junit.jupiter.engine.execution.InvocationInterceptorChainValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
profile
개린이

0개의 댓글