Refactor - service packge

도입

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

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


결과

AS-ISTO-BE

실습

Step1. Package 재구성 및 Rename

AS-ISTO-BE
비교
문제점 및 해결책 1의존성 강함, 확장성 적음Interface를 통해 의존성 제거, 확장성 증가
문제점 및 해결책 2변수, 메소드 명이 명확하지 않음Renaming을 통해 명확화
문제점 및 해결책 3직접 구현한 SeekbarThread 제거ScheduledExecutorService로 주기적으로 명령어 실행

Step2. SeekbarThread -> ScheduledExecutorService로 변경'

  • AS-IS
override fun run() {
    while (runFlag) {
        for (observer in observers) {
            observer.setCurrentProgress(currentStatus)
        }
        try {
            Thread.sleep(1000)
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }
    }
}
  • TO-BE
intervalExecutor?.scheduleAtFixedRate(
    updateSeekBarPositionRunnable,
    0L /*initialDelay*/,
    REFRESH_INTERVAL_MS,
    TimeUnit.MILLISECONDS
)

Step3. 테스트 코드 작성

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

  • AS-IS
@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
    )
}
  • Result

느낀점

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

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

좋은 웹페이지 즐겨찾기