본문 바로가기

Android

dagger + OkHttp3IdlingResource

개인적으로 dagger 를 이용중에 androidTest 에서 OkHttp3IdlingResource 를 적용해야할 상황이 되어 잠시 뒤적 뒤적 거리곤 내린 결론

dagger 에서 okhttp client 는 @Singleton 으로 설정해둔 것을 전제로
MainActivity 에 okhttpclient 를 @inject 하고 이를 androidTest 에서 가져다가 OkHttp3IdlingResource create 하면 되지 않을까 싶었는데

일단 된다.
소스로 보자면 먼저 MainActivity 에는 아래와 같이 선언해주고

class MainActivity : BaseDaggerActivity<MainActivityBinding, MainViewModel>() {
    // ..

    ////////////////////////////////////////////////////////////////////////////////////
    //
    // TEST
    //
    ////////////////////////////////////////////////////////////////////////////////////

    // https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp
    @VisibleForTesting
    @Inject lateinit var okhttp: OkHttpClient
}

네트워킹 작업이 필요한 테스트 클래스에서 아래와 같이 넣어주었더니 잘 작동하긴 했는데
요즘 내 노트북이 살짝 이상한지라.. =_ = 내일 다시 돌려보고 검토 해봐야할 듯 자꾸 되던게 안되고 안되던게 되는 기이한 현상... ;ㅁ;
디렉토리를 복사하고 수정했는데 원래 자리가 수정되었다던지.. 이런 기묘한 일이 털썩. OTL

@RunWith(AndroidJUnit4::class)
class SearchTest {
    private var mIdlingResource: IdlingResource? = null

    @Before
    fun registerIdlingResource() {
        val activityScenario = ActivityScenario.launch(MainActivity::class.java)
        activityScenario.onActivity { activity ->
            mIdlingResource = OkHttp3IdlingResource.create("okhttp", activity.okhttp)
        }
    }

    @Test
    fun searchFragmentTest() {
        mIdlingResource?.let { IdlingRegistry.getInstance().register(it) }
        searchIcon().perform(click())

        dibsIcon(0).perform(click())
        dibsIcon(1).perform(click())

        mIdlingResource?.let { IdlingRegistry.getInstance().unregister(it) }

        // ....
    }

    // ....
}