문제 상황
unit test를 위한 테스트 코드 작성 중 문제를 발견했다.
해당 코드를 실행했더니 다음과 같은 에러가 나왔다.
java.lang.RuntimeException: Method d in android.util.Log not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
원인
해당 오류를 번역하면 다음과 같다.
"RuntimeException: <android.util.log> 클래스의 메서드 d는 테스트 환경에서 사용할 수 없습니다."
유닛 테스트 환경에서는 Android의 실제 기능을 사용할 수 없다. 따라서, d와 같이 android 환경에서 사용하는 메서드가 nutriDailyValue.carbs 속에 있기 때문에 이러한 오류가 발생한 것이다.
해결 : Robolectric으로 Android 환경 모킹하기
Robolectric은 Android의 실제환경을 테스트 환경에 모킹하여 유닛 테스트를 실행하게 해 주는 라이브러리이다.
이를 활용하면 테스트 환경에서도 Log 와 같은 기능을 사용할 수 있다.
1. 모듈수준 build.gradle에 테스트 의존성 추가하기
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.13")
2024년 9월 기준 버전은 다음과 같지만, 깃허브에서 최신 버전을 확인하고 적용할 수 있다!
https://github.com/robolectric/robolectric
GitHub - robolectric/robolectric: Android Unit Testing Framework
Android Unit Testing Framework. Contribute to robolectric/robolectric development by creating an account on GitHub.
github.com
2. Test Class에 @RunWith(RobolectricTestRunner::class) 주석 추가하기
@RunWith(RobolectricTestRunner::class)
class NutriUnitTest {
private lateinit var nutriDailyValue: NutrientDailyValues
.
.
@Test
fun userNutri_isCorrect() {
assertEquals(5, nutriDailyValue.carbs.personalize().toString())
}
}
결과
프로젝트의 데이터 클래스 이해가 안되는 부분이 있어 실패했지만...ㅋㅋ 그래도 구동은 성공했다.
'CS > Kotlin' 카테고리의 다른 글
[MVVM] LiveData (0) | 2024.11.12 |
---|