관리 메뉴

나만을 위한 블로그

[Android] 단위 테스트 작성 시 Method d in android.util.Log not mocked 에러 해결 본문

Android

[Android] 단위 테스트 작성 시 Method d in android.util.Log not mocked 에러 해결

참깨빵위에참깨빵 2023. 8. 7. 19:48
728x90
반응형

※ 이 포스팅은 Mockito가 아닌 MockK를 사용했을 경우를 바탕으로 작성됐다

 

뷰모델에 만든 함수들을 대상으로 애써 테스트를 작성한 후, 성공하는지 확인하려고 테스트를 실행하면 가끔 아래와 같은 에러가 발생할 수 있다.

 

Method d in android.util.Log not mocked.

 

android.util.Log 클래스의 d()가 mock되지 않았단 뜻이다. d를 쓰지 않았다면 w, i, e가 될 수도 있는데, 이 에러가 발생하는 이유는 순수 JUnit 프레임워크와 코틀린으로 작성한 테스트가 아니라 Log나 Uri 같이 안드로이드 프레임워크(android로 시작하는 패키지)에 속하는 클래스들을 단위 테스트에서 사용하려면 mock 객체를 만들어 사용해야 한다.

그런데 그런 처리 없이 뷰모델에 로그를 심어둔 채로 테스트를 작성하고 실행하면 저 에러가 발생하면서 테스트가 실패하는 것이다.

 

이 문제의 해결법은 그리 어렵지 않다. 저 에러 메시지가 표시되지 않도록 Log 클래스를 mocking하면 된다.

아래와 같이 BaseTest를 작성할 수 있다.

 

import android.util.Log
import io.mockk.every
import io.mockk.mockkStatic

open class BaseTest {
    fun mockLogClass() {
        mockkStatic(Log::class)
        every { Log.v(any(), any()) } returns 0
        every { Log.d(any(), any()) } returns 0
        every { Log.i(any(), any()) } returns 0
        every { Log.e(any(), any()) } returns 0
    }
}

 

mockLogClass()는 테스트 파일의 @Before가 붙은 함수 안에 선언하면 된다.

 

이후 테스트를 작성한 클래스에서 BaseTest 클래스를 상속한 다음 @Before가 붙은 함수 안에 선언만 해 주면 필요한 처리는 끝난다. 이렇게 하면 앞으로 Log 클래스를 mock해야 한다는 에러는 더 이상 발생하지 않는다.

 

@RunWith(JUnit4::class)
class FooViewModelTest: BaseTest() {

    @Before
    fun setUp() {
        mockLogClass()
        .
        .
        .
    }
    .
    .
    .
}

 

참고한 사이트)

 

https://stackoverflow.com/questions/36787449/how-to-mock-method-e-in-log

 

How to mock method e in Log

Here Utils.java is my class to be tested and following is the method which is called in UtilsTest class. Even if I am mocking Log.e method as shown below @Before public void setUp() { when(Lo...

stackoverflow.com

 

반응형
Comments