본문

[2019.02.26] 124. Android 음악 플레이어 프로젝트 [Refactoring - service]

도입

이번 포스팅에서는 음악 플레이어의 service관련 클래스들을 리팩토링할 예정이다.

리팩토링 결과를 먼저 확인하고 리팩토링 과정을 공유할 예정이다.


결과

AS-IS

TO-BE

 

실습

Step1. Package 재구성 및 Rename

 

AS-IS

TO-BE

비교

개선사항

해결책

의존성 강함, 확장성 적음

Interface를 통해 의존성 제거, 확장성 증가

변수, 메소드 명 명확하지 않음

Renaming을 통해 명확화

직접 구현한 SeekbarThread 제거

ScheduledExecutorService로 주기적으로 명령어 실행

Step2. SeekbarThread -> ScheduledExecutorService로 변경

AS-IS

TO-BE

1
2
3
4
5
6
7
8
9
10
11
12
override fun run() {
    while (runFlag) {
        for (observer in observers) {
            observer.setCurrentProgress(currentStatus)
        }
        try {
            Thread.sleep(1000)
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }
    }
}

cs

1
2
3
4
5
6
intervalExecutor?.scheduleAtFixedRate(
    updateSeekBarPositionRunnable,
    0L /*initialDelay*/,
    REFRESH_INTERVAL_MS,
    TimeUnit.MILLISECONDS
)
cs
 

Step3. 테스트 코드 작성

리팩토링 후 테스트 코드 및 디버그 로그 설정

TestCode

Result

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
fun setMedia_success() {
    Whitebox.setInternalState(
        audioPlayerController, 
        "player"
        mockMediaPlayer
    )
    doReturn(false).whenever(mockMediaPlayer).isPlaying
 
    audioPlayerController.play()
 
    verify(mockNotificationService, times(1)).onStateChanged(
        MediaAction.MEDIA_PLAY,
        isChangedMediaByButton = false
    )
    verify(mockPlayEndViewActivity, times(1)).onStateChanged(
        MediaAction.MEDIA_PLAY,
        isChangedMediaByButton = false
    )
}
cs

느낀점

테스트 코드 진짜 삽질 많이했다. 

익숙해지지 않는 불편함에 좌절 ㅋㅋㅋ

 

 

#안드로이드 음악플레이어 #음악 플레이어 개발 #Android MusicPlayer  #앱개발 #모바일앱개발 #어플개발

공유

댓글