Android Weekly

Android Weekly #-592 "더쉬운 network mocking on Android"

베블렌 2023. 12. 8. 03:36

10월 3주차에는 더쉬운 네트워크 mock의 방법에 대한 소개입니다.

 

https://proandroiddev.com/introducing-iris-mock-an-easier-way-to-mock-network-calls-on-android-11de6ff43316

 

Introducing Iris Mock: An easier way to mock network calls on Android

This article is a mix of presenting a new tool I have developed to make network mocks easier on Retrofit, Volley and any OkHttp based tool…

proandroiddev.com

 

 

 

소개

모킹(Mocking) : 소프트웨어 개발과 테스팅 분야에서 사용되며, 실제 객체, 함수, 시스템 똔느 서비스의 동작을 흉내 내는 가짜 구현을 만드는 과정. 주된 목적은 테스트하려는 시스템의 나머지 부분과 독립적으로 특정 부분을 테스트하기 위함.

 

이 글은 Arildo Borges Jr가 개발한 새로운 도구인 Iris Mock에 대해 소개하고 있습니다. 이 도구는 Retrofit, Volley 및 OkHttp 기반 도구에서 네트워크 모킹을 용이하게 만들어 주는 것을 목표로 합니다. 개발자들이 실제 API에 의존하지 않고도 자동화된 테스트를 수행하거나, 아직 API에서 사용할 수 없는 새로운 기능을 테스트하는 경우에 유용하다고 합니다.

 

내용

  • 전통적인 방식과의 비교: 기존에는 OkHttpClient 빌더에 인터셉터를 추가하는 방식으로 네트워크 호출을 모킹했습니다. 그러나 이 방법은 상당한 양의 보일러플레이트 코드를 필요로 했습니다.
class MockInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val uri = chain.request().url.toUri().toString()
        val responseString = when {
            uri.endsWith("/exampleEndpoint") -> "{ 'response': 'mockedResponse' }" // 모킹 데이터
            else -> ""
        }

        return chain.proceed(chain.request())
            .newBuilder()
            .code(200) // HTTP 200 OK
            .protocol(Protocol.HTTP_1_1)
            .message(responseString)
            .body(
                ResponseBody.create(
                    MediaType.parse("application/json"),
                    responseString.toByteArray()
                )
            )
            .addHeader("content-type", "application/json")
            .build()
    }
}

fun provideOkHttpClient(): OkHttpClient {
    return OkHttpClient.Builder()
        .addInterceptor(MockInterceptor()) // 모킹 인터셉터 추가
        .build()
}

 

 

 

  • Iris Mock 사용: Iris Mock은 이러한 복잡성을 해결하기 위해 만들어졌습니다. DSL API를 통해 보다 간단하고 직관적인 방식으로 모킹 로직을 구현할 수 있습니다. 클래스에 @IrisMockInterceptor 어노테이션을 추가하기만 하면, Iris Mock이 OkHttpClient의 바이트코드에 직접 사용자 정의 인터셉터를 주입합니다.
plugins {
    id("com.example.irismock") version "1.0"
}

 

@IrisMockInterceptor
class MyInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        // 여기에 모킹 로직 구현
    }
}
  • 장점: Iris Mock은 빠른 성능을 제공하며, 일반적으로 OkHttpClient 빌더에 접근할 수 없는 서드파티 라이브러리에서도 커스텀 인터셉터를 사용할 수 있게 해줍니다.

 

정리

  • 플러그인 개발 경험: 글의 저자는 Iris Mock 개발 과정에서 배운 점들을 공유합니다. 처음에는 ASM 라이브러리를 사용하여 OkHttpClient 바이트코드에 모든 인터셉터를 추가하는 방식을 시도했으나, 이 방법은 예상대로 작동하지 않았습니다. 그 후 KSP를 사용하여 래퍼 클래스를 빌드 시간에 생성하는 방법으로 전환했습니다. 최종적으로는 Kotlin Compiler Plugin을 사용하여 이 문제를 해결했습니다.
  • 플러그인 사용의 용이성: Iris Mock 플러그인을 사용하면 사용자는 Iris Mock 런타임 의존성을 직접 추가할 필요가 없습니다. 이는 플러그인과 의존성 간의 호환성 관리를 더욱 쉽게 만들어줍니다.

 

 

인터셉터에 관한 내용인가 싶어 읽었는데 모르는 단어가 너무 많이 나와버린 글입니다.

아직 테스팅을 배우는 과정이라 나중에 기억날때 다시 보는 용도.

 

 

 

 

https://androidweekly.net/

 

Android Weekly - Free weekly Android & Kotlin development newsletter

Android Weekly - Free weekly Android & Kotlin development newsletter

androidweekly.net