Aaron
1k
2018-11-27 14:08:06
2
466

Android 앱 개발 시 JUnit 테스트 코드 작성하는데 고민이 생기네요..


Rx를 사용하여 앱 개발 중에 있습니다.

Architecture는 MVP 패턴을 사용하고 있고요.


interface MainContract {
    interface View {}
    interface Presenter {}
}

class MainActivity: MainContract.View
class MainPresenter: MainContract.Presenter

대충 위와 같이 Contract를 베이스로 MVP 코드를 작성하고 있습니다.


Presenter 코드를 아래와 같이 작성하였는데요.

class MainPresenter(
    private val view: MainContract.View,
    private val retrofitService: RetrofitService = RetrofitService.getRetrofitService(),
    private val disposable: CompositeDisposable = CompositeDisposable()
) : MainContract.Presenter {

    override fun getJobs() {
        view.enableProgressBar(View.VISIBLE)
        disposable.add(
            retrofitService.getJobs() // HTTP GET Request using Retrofit
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { jobList ->
                    view.onJobsLoaded(jobList)
                    view.enableProgressBar(View.GONE)
                }
        )
    }
}


Presenter의 getJobs 메서드는 Retrofit을 통해 job 목록을 가져오는 함수입니다.

가져온 결과를 view에게 전달해주는데요.

getJobs 메서드를 JUnit으로 테스트하려고 하는데...

보시다 시피 Observer를 disposable에 add함으로 인해 return을 아무 것도 하고 있지 않습니다.

disposable에 add 하는 이유는 activity lifecycle에 의해 stop/terminate 될 때 clear/dispose하기 위함입니다.


결국 위 코드를 테스트가 가능하도록 만들기 위해서는 Presenter에 있는 disposable을 view로 빼고,

getJobs() 메서드는 observer를 return 하도록 변경하면 될 것 같은데요.

그럼 Test Class에서도 TestObserver를 통해 test code를 작성할 수 있을 것 같습니다.


그런데...

제 고민은 그럼 view에서 disposable을 들고 clear/dispose해야 한다는 건데...

흠 이게 View의 역할이 맞는 건지 모르겠네요.

혹시 관련하여 Best Practice가 있을 까요?

0
0
  • 답변 2

  • EF
    903
    2018-11-27 16:30:48

    현재 보이는 코드도 테스트 하는데 전혀 문제 없어보여요.

    MainPresenter 생성시 View와 RetrofitService인자를 넣잖아요? 테스트 할 때 mock View와 RetrofitService를 집어넣으면 됩니다. 그리고 MainPresenter에 getJobs()를 호출하고 mock된 View의 onJobsLoaded와 enableProgressBar 등의 맞게 호출 되었는지를 확인하면 됩니다.


    안드로이드 Best Practice와 관련해서 제가 애용하는 GitHub 리포가 있는데요:

    https://github.com/googlesamples/android-architecture/tree/master

    똑같은 기능을 하는 앱을 구글 개발자들이 MVP/MVVM, LiveData/RxJava, Java/Kotlin 각종 라이브러리/아키텍쳐/언어 별로 구현해서 비교해 놓은 리포입니다. 유닛테스트까지 거의 완벽하게 작성되어 있어서 남들 어떻게 하나 보고 싶을 때 보면 좋아요.


    1
  • Aaron
    1k
    2018-11-27 23:07:35

    EF 답변 감사합니다~

    Mockito로 하면 되는 거였군요!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.