[Android] JUnit4 테스트 에러해결-NoClassDefFoundError, 컴파일 결과물을 확인해보자!

Lee Yongin·2024년 8월 13일
1

안드로이드

목록 보기
21/23
post-thumbnail
post-custom-banner

NoClassDefFoundError

테스트를 실행했는데 아래와 같은 에러를 계속 보게 되었다.

java.lang.NoClassDefFoundError: com/hmoa/core_database/TokenManagerImpl

	at java.base/java.lang.Class.getDeclaredMethods0(Native Method)

클래스를 못찾는 거니까 IDE 캐시를 지워보거나, 재시작을 해보거나, 클래스가 생각밖의 위치에 있지는 않은지 확인해보아야 한다.

원인 - 클래스를 컴파일한 결과물이 없기 때문

스택오버플로우의 답변 하나가 힌트를 알려주었다.

이 답변을 보고 직접 문제가 된 모듈의 build/intermediates/classes 폴더를 열어보게 된 것이다.
확실히 DataStorePreferenceTest.kt를 컴파일해서 생성되었어야 할 DataStorePreferenceTest.class가 없었을 뿐더러 debugUnitTest 폴더 조차 없었다. main에 작성한 파일들과 디폴트로 있었던 androidTest의 파일 1개가 전부였다.
즉 uniTest관련 클래스 결과물이 없으면...ClassDefNotFoundError가 난다는 것을 알았다.

build폴더 확인하기

아래의 스크린 샷은 문제를 해결한 뒤의 폴더 내용이다. build/intermediates/classes에 unitTest의 컴파일 중간 결과물들이 있어야 테스트가 가능하다.
이 폴더에는 Java 또는 Kotlin 소스 코드가 컴파일된 '.class' 파일들이 포함된다.

뭐가 문제인지 몰라서 여러시도를 해보았는데 결국 되었다. 특정지어서 뭐가 해결책이었다!!!는 모르겠는데 밑의 방법 중 하나가 고쳐주었으니(자랑이 아닙니다...) 아래와 같이 해보길 바란다.
1. invalidate and restart
2. clean build
3. 읽지 못하고 있는 클래스 파일이 올바른 위치에 있는지 확인하기
4. gradle 확인
test관련 빌드오류가 있는 경우에도 앱이 빌드가 되긴하기 때문에 테스트하기 전까지 testAnnotationProcessor이나 testImplementation 의존성이 맞는지 모를 수도 있다.
나의 경우 hilt를 이용했기 때문에 관련 컴파일러 라이브러리가 없어서 문제가 되기도 했으니 필요한 라이브러리를 갖추었는지 확인하자.

//hilt test
    kaptTest("com.google.dagger:hilt-android-compiler:$hilt_version") // ...with Kotlin.
    testImplementation("com.google.dagger:hilt-android-testing:$hilt_version") // For Robolectric tests.
    testAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.44") // ...with Java.

5.아래 명령어 실행해서 개별적으로 clean하고 test하기
이게 내가 마지막으로 한 방법이었고 결국 테스트에 성공했다.

./gradlew clean :core-database:test --tests "com.hmoa.core_datastore.DataStorePreferenceTest"

profile
⚡개발자할거야 응애 안드로이드 개발자 ⚡p.s.기록만이 살길이다!
post-custom-banner

0개의 댓글