스팀 앱 개발기 #36 - 유닛 테스트로 구현한 WalletViewModelTest 클래스에서 공통 부분 추출하여 CommonPartOfViewModelTest 클래스 만들기
시작하며...
#34에서 구현한 WalletViewModelTest 클래스의 문제점을 #35에서 설명드렸구요. 이번 포스트에서는 그 문제점을 해결하기 위한 코드 개선을 진행하고자 합니다.
향후 발생할 코드 중복을 방지하기 위해 CommonPartOfViewModelTest 클래스 정의
모든 ViewModelTest 클래스들은 InstantTaskExecutorRule 객체를 필요로 하구요. 테스트가 시작될 때 WalletViewModelTest 클래스에서 구현된 setUp() 메소드와 teardown() 메소드도 필요로 합니다. 이와 같이 ViewModelTest 클래스들이 공통으로 사용할 코드는 CommonPartOfViewModelTest 클래스로 옮깁니다.
open class CommonPartOfViewModelTest {
@Rule
@JvmField
val instantExecutorRule = InstantTaskExecutorRule()
companion object {
@JvmStatic
@BeforeClass
fun setUp() {
// Refer to https://medium.com/@jungil.han/junit-rxjava-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%BB%B4%ED%8C%A8%EB%8B%88%EC%96%B8-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-e8d17b674bdd
RxJavaPlugins.setIoSchedulerHandler {
Schedulers.trampoline()
}
RxAndroidPlugins.setInitMainThreadSchedulerHandler {
Schedulers.trampoline()
}
}
@JvmStatic
@AfterClass
fun teardown() {
RxJavaPlugins.reset()
RxAndroidPlugins.reset()
}
}
}
WalletViewModelTest 클래스가 CommonPartOfViewModelTest 클래스를 상속 받음
뷰모델 클래스가 CommonPartOfViewModelTest 클래스를 상속받게 합니다. 그러면 뷰모델 클래스에서는 뷰모델 객체를 정의하고 테스트 메소드들을 작성하면 됩니다. 이를 적용한 결과는 아래와 같습니다. 테스트 본연의 코드들만 보이니 훨씬 깔끔해 보이지요.
class WalletViewModelTest : CommonPartOfViewModelTest() {
var walletViewModel = WalletViewModel()
// Test case 1: Trying to get the wallet of a valid account.
@Test
fun readSteemitWallet_case1() {
walletViewModel.readSteemitWallet("dorian-mobileapp").subscribe { steemitWallets ->
assertEquals("dorian-mobileapp", walletViewModel.steemitWallet.value?.account)
}
}
// Test case 2: Trying to get the wallet of an invalid account.
@Test
fun readSteemitWallet_case2() {
walletViewModel.readSteemitWallet("invalid10293845").subscribe { steemitWallets ->
assertEquals("", walletViewModel.steemitWallet.value?.account)
}
}
}
GitHub Commit
지난 스팀 앱 개발기
- #35 - 유닛 테스트용 WalletViewModelTest 클래스 구현 후 보이는 문제점
- #34 - WalletViewModel 클래스에 스팀 지갑 정보 읽는 코드 작성
- #33 - 추가 리팩토링: 데이터 모듈의 데이터 클래스의 필드들에 nullable 적용
- #32 - 리팩토링: 데이터 클래스 이름 변경
- #31 - 도메인 모듈에서 정의하는 데이터 클래스들이 DTO 패턴을 따르는 것이 맞는가?
- #30 - 진도를 더 나가기 전에 리팩토링 고려 중
- #29 - 뷰모델, Repository 패턴 그리고 Use Case 패턴의 관계
- #28 - Use Case 패턴 적용
- #27 - Repository 패턴 적용
- #26 - condenser_api.get_accounts API로 받은 계정 자료를 SteemitWalletDTO 타입으로 변환하기
- #25 - SteemClient, SteemService 잘 작동하는지 유닛 테스트
- #24 - API 실행을 담당할 SteemService 인터페이스 정의
- #23 - condenser_api.get_accounts API 연동에 필요한 데이터 클래스 정의
- #22 - API 연동에 필요한 라이브러리 추가
- #21 - 사용자 지갑 정보를 담을 SteemitWallet 클래스 정의
- #20 - 클린 아키텍처를 위한 모듈 구성 (2)
- #19 - 클린 아키텍처를 위한 모듈 구성 (1)
- #18 - VEST로부터 STEEM POWER를 계산하는 방법
- #17 - VEST를 STEEM POWER로 변환하기 위해 필요한 get_dynamic_global_properties API
- #16 - 지갑 내용을 읽기 위해 필요한 API
- #15 - 지갑 서브화면(WalletFragment) 레이아웃 구성해 보기
- #14 - 지갑 서브화면(WalletFragment)에서 계정 인식하기
- #13 - 프로파일 서브화면(ProfileFragment)에서 계정 인식하기
- #12 - 태그 서브화면에서 태그 인식하기
- #11 - 검색 레이아웃을 메인 화면에 적용
- #10 - 태그 및 계정 검색 레이아웃 만들기
- #9 - BaseActivity 클래스 정의 그리고 MainActivity 클래스에 적용
- #8 - BaseFragment 클래스 정의 그리고 기존 프래그먼트들에 적용
- #7 - ProfileFragment 그리고 WalletFragment에 데이터 바인딩 적용
- #6 - 태그별 검색 내용을 보여줄 TagsFragment에 데이터 바인딩 적용
- #5 - GitHub에 소스 올리기
- #4 - 하단 내비게이션의 탭 관련 클래스 이름 수정
- #3 - 하단 내비게이션 바의 아이콘, 텍스트 수정
- #2 - 프로젝트 생성
- #1 - 시작하며...
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.