-
테스트 코드 작성할 때 Junit5 사용시 JUnit Vintage 오류 발생Spring 2022. 1. 11. 11:40
테스트 코드를 작성하던 중 다음과 같은 오류를 맞닥뜨리게 되었다.
테스트 메소드를 읽지 못하는 메세지였다.
Junit5
import org.junit.jupiter.api.Test; class Junit5Test { @Test void test() { //... } }
단일 jar였던 Junit4와는 다르게 Junit5는 Junit Platform, Junit Jupiter, Junit Vintage 세가지로 이루어져있다.
- Junit Platform : JVM에서 동작하는 테스트 프레임워크 (TestEngine 인터페이스 정의)
- Junit Jupiter : Junit5 기반의 테스트 실행 (TestEngine의 실제 구현체)
- Junit Vintage : Junit3 및 Junit4 기반의 테스트 실행 (TestEngine에서 실행)
해결방안 ①Test import 변경
//import org.junit.jupiter.api.Test; import org.junit.Test; public class UserActivitytest { @Test @DisplayName("사용자 액티비트를 삭제하고 삭제된 액티비티 점수에 따라 사용자 레벨을 수정한다.") public void deleteUserActivity() { //given //... } }
테스트 어노테이션을 사용시 import되는 Test를 org.junit.jupiter.api.Test에서 org.junit.Test로 바꿔서 입력해준다. 그러면 해당부분은 대부분 문제가 해결되며 제대로 테스트 코드가 실행될 것이다.
하지만 나의 경우에는 org.junit.jupiter를 이용한 @ParameterizedTest를 진행하고자 하였기에 이는 근본적인 해결 방안이 되지 못했다.
해결방안 ② class 접근자 제거
import org.junit.jupiter.api.Test; class UserActivitytest { @ParameterizedTest @CsvSource({"updateTest,3,update-activity-test,activity/imageUrl", "update,7,update-Test,update/imageUrl"}) @DisplayName("액티비티를 수정한다.") public void update_activity(String name, int score, String description, String imageUrl) { //... } }
jupiter테스트를 사용하기 위해서 위와 같이 테스트 클래스에서 최상위 접근자를 제거해줌으로서 문제가 해결되었다. Junit5의 사용법이 class에 접근자를 붙이지 않는 것인데 접근자를 붙임으로서 Junit Vintage( Junit3 및 Junit4 )의 실행을 야기시킨 것 같다. (추측)
import org.junit.jupiter.api.Test; class UserActivitytest { @ParameterizedTest @CsvSource({"updateTest,3,update-activity-test,activity/imageUrl", "update,7,update-Test,update/imageUrl"}) @DisplayName("액티비티를 수정한다.") // private void update_activity(...) { public void update_activity(String name, int score, String description, String imageUrl) { //... } }
추가로 만약 여기서 java.lang.Exception: Method ... should be public 의 오류가 발생한다면 Junit 메소드는 Junit 프레임 워크에 의해 클래스 외부에서 호출되므로 테스트 메소드를 public 으로 바꾸어 주어야 한다.
(참고한 사이트)
https://hirlawldo.tistory.com/39
https://www.inflearn.com/questions/249549
https://stackoverflow.com/questions/37019972/why-junit-test-casesmethods-should-be-public
'Spring' 카테고리의 다른 글
JPA 엔티티에 생성 시점, 수정 시점 Timestamp 추가하기 ( + Auditing) (0) 2022.01.13 JPA getById() 와 findById()의 차이 (0) 2022.01.12 Lombok 사용시 주의할 점 (0) 2021.12.29 RESTful API (2) 2021.12.19 트랜잭션 (feat. @Transactional) (0) 2021.12.18