이번에 회사 프로젝트를 진행하면서 UI Test Code 를 작업하는데 한 가지 문제가 생겼다.
우리는 UI Test 를 위해 작업할때 ViewModel 에 Inject 되고 있는 인스턴스들에 대한 MockUp 설정을 위해 Mockk 라이브러리를 사용하는데, Mockk 를 아무리 사용해도 DataStore 에서 값을 가져오는 UseCase 가 엉뚱한 값을 내뱉는다는 에러가 발생하는 것이다.
에러의 발생 원인은 내가 꺼내려는 것이 Custom class 인 A class 이고, 이를 직접 명시해줬음에도 테스트 실행 시 자꾸 A class 를 String 으로 변환작업처리 후 꺼내려고 하는 것이 문제였다.
분명 실제 앱을 구동하였을때는 정상 작동하는 코드가, 왜 Test 실행시에만 이러는 것인지 알아내기 위해서 인터넷을 이곳저곳 살핀 결과,나는 어쩌면 당연한 결과를 알게 되었다.
Cannot objectMockk inline function · Issue #55 · mockk/mockk
I tried to objectMockk an inline function of an object and it didn't seem to work. I did sth like ` @BeforeAll fun beforeTests() { objectMockk(MockObj).mock() every { MockObj.getSth<Room>(1) } retu...
github.com
그 이유는 다음과 같았다
다른 모킹 프레임워크와 마찬가지로 mockk는 메서드에 대해 바이트코드 수준 계측에 의존합니다. 함수를 로 표시하면
inline 컴파일러는 바이트코드 수준에서 메서드를 생성하지 않습니다.
라는 것이 내 클래스가 정상적으로 꺼내지지 않는 것의 이유였다.
내가 Mock 설정하려던 클래스는 Inline function 으로 reified Generic Type 을 꺼낼 때, 해당 클래스에 대해 알 수 없어서 Mock 에서는 String Type 으로 꺼내려고 시도를 하던 것이었다.
즉, 내가 하려던 Mock 작업은 당연히 안되는 것이었고 절대로 불가능한 작업이라는 것이었다.
이에 대해 하나의 정보를 알아서 좋긴 하였지만, 꽤 오랜 시간을 허비해서 알아낸게 뼈가 아프다 ..
Generic Type 이라고 할지라도 Primitive Type 으로 꺼낼 때는 정상작동한다.
이에 대한 이유는 모르겠지만 ChatGPT 에게 물어보니 이러한 기본 타입들은 무언가 예외가 있다고 하니 .. 우선 그러려니 하려고 한다.
++ Mock 작업을 할때는 StringType 으로 명시를 해주면 테스트 당시에는 실제 함수에서 정상적으로 꺼내진다 .. 이유는 모르겠다