테스트를 실행했는데 아래와 같은 에러를 계속 보게 되었다.
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/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"