[Spring Framework, Test] 테스트 시 java.lang.NoSuchMethodError: 'boolean org.json.JSONArray.isEmpty()' 이슈

mrcocoball·2025년 4월 3일

Spring Framework

목록 보기
17/20

개요

실제 실행 시에는 문제가 없지만 테스트를 돌릴 때에만 java.lang.NoSuchMethodError: 'boolean org.json.JSONArray.isEmpty() 예외가 발생하는 문제가 있었다.

확인 결과 및 대응

문제가 되는 코드

JSONArray가 비었는지를 확인하는 조건문이 있었는데, 이전 코드에는 dataArray.length() > 0 형식으로 조건을 확인하던 것을 리isEmpty() 를 사용하는 것으로 변경하였다. 당연히 문제는 없었다.


...
JSONArray dataArray = ....
if (dataArray.isEmpty()) {
	...
}

그런데 정작 저 코드가 들어간 메서드를 테스트하던 과정에서 java.lang.NoSuchMethodError: 'boolean org.json.JSONArray.isEmpty() 가 발생하였다.

원인

에러 로그만 확인했을 때 알 수 있었던 원인은 JSON 라이브러리 버전 문제였다. JSONArray에 대한 isEmpty() 메서드는 오래된 JSON 라이브러리에는 없는 메서드라고 한다. 그래서 보통 JSON 라이브러리의 버전 이슈로 저런 문제가 발생한다고 한다.

그러나 정작 JSON 라이브러리는 최신 버전을 사용하고 있었고 무엇보다 실제로 실행했을 때엔 문제가 없었다.
테스트에만 이런 문제가 발생하여 내용을 찾아보니, Spring Boot 테스트 의존성 내의 JSON 라이브러리 문제일 가능성이 있다는 것을 알게 되었다.

실제로 다음 코드로 테스트 환경에서 로드된 클래스를 확인해보니 버전이 예전 버전으로 찍혔다.

@Test
void printClassPath() {
    System.out.println(org.json.JSONArray.class.getProtectionDomain().getCodeSource());
}

대응

Maven 환경을 쓰고 있으므로 pom.xml에서 다음과 같이 spring-boot-test-starter 내의 오래된 라이브러리를 제거하였다.
Gradle 환경에서도 비슷한 기능이 있다고 한다.

...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
          	<!-- 오래된 라이브러리 제거 -->
            <exclusions>
                <exclusion>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.vaadin.external.google</groupId>
                    <artifactId>android-json</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.skyscreamer</groupId>
                    <artifactId>jsonassert</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
...

Reference

https://stackoverflow.com/questions/54418646/nosuchmethoderror-using-jsonarray-in-org-json

profile
Backend Developer

0개의 댓글