코드 작성 시 정적 변수와 정적 메서드 사용을 지양해야 하는 이유 알아보기

2022. 12. 24. 22:33·Unit Testing
반응형

Static Variable과 Static Method

정적인 변수와 메서드는 한 번 선언 해놓으면 이곳 저곳에서 모두 사용할 수 있기 때문에 매우 편리하게 사용될 수 있다. 하지만, 시스템적으로 보았을 때 정적인 변수와 메서드는 최대한 지양하는 것이 좋다. 정적인 변수와 메서드를 참조 하는 클래스가 늘어난다는 것은 정적 변수와 메서드에 의존성이 생긴다는 것을 뜻한다.

 

이는 프로그램이 작을 때는 문제가 없지만 프로그램이 커지면 커질 수록 큰 문제로 번진다. 특히 정적 변수는 해당 변수가 여러 클래스에서 공유되게 될 경우 해당 클래스들이 서로가 서로에게 의존성이 생기는 것을 의미한다. 정적 메서드의 경우 정적 변수를 참조하지 않으면 그나마 낫지만, 정적 변수를 참조하지 않더라도 테스트 시에 문제가 생길 가능성이 크다.

 

정적 메서드 사용 시 문제 상황 알아보기

예를 들어 인터넷에 연결해 유저 이름을 검증해야 하는데, 해당 유저 이름을 검증하기 위한 메서드를 정적 메서드로 만든 경우를 생각해보자. 

class UserNameValidator() {
    fun validateUserName(userName: String) : Boolean {
        return validateUserNameFromServer(userName)
    }
}

fun validateUserNameFromServer(userName: String) : Boolean {
	//Server Call
    return false
}

 

UserNameValidator 클래스를 테스트 하기 위해서는 validateUserName() 메서드가 무조건 실행되어야 하는데 정적 메서드 이기 때문에 이를 바꿀 방법이 없다. Test Double을 사용하기 위해서는 객체가 있어야 한다. 따라서 validateUserName 클래스는 테스트를 할 수가 없게 된다.

 

문제 상황 수정하기

위 문제를 해결하기 위해서는 다음과 같이 수정해야 한다. 그러면 ServerValidator을 Stub 같은 Test Double로 바꿔치기가 가능하기 때문에 테스트가 가능해진다.

class UserNameValidator(private val serverValidator: ServerValidator) {
    fun validateUserName(userName: String) : Boolean {
        return serverValidator.validateUserNameFromServer(userName)
    }
}


class ServerValidator() {
    fun validateUserNameFromServer(userName: String): Boolean {
    	//Server Call
        return false
    }
}

 

정리

정적 메서드와 변수를 코드 상에서 최대한 줄이자. 어쩔 수 없이 사용하는 경우도 있을 수 있지만 최대한 줄이는 것이 좋다.

반응형

'Unit Testing' 카테고리의 다른 글

[Unit Testing] Android의 정적 메서드를 사용하거나 Android 전용 클래스를 사용하면 테스트에 실패하는 이유 알아보기  (0) 2022.12.26
[Unit Testing] Android Context 객체를 사용하는 클래스 테스트하기  (0) 2022.12.25
MockitoJUnitRunner 사용해 Mockito 코드 깔끔하게 만들기 : @Mock  (0) 2022.12.23
Kotlin에서 Mockito ArgumentCaptor 사용시 java.lang.NullPointerException: argumentCaptor.capture() must not be null 나오는 현상 해결 방법  (0) 2022.12.22
[Mockito] ArgumentCaptor 사용해 객체의 interaction 기록하기  (0) 2022.12.21


'Unit Testing' 카테고리의 다른 글
  • [Unit Testing] Android의 정적 메서드를 사용하거나 Android 전용 클래스를 사용하면 테스트에 실패하는 이유 알아보기
  • [Unit Testing] Android Context 객체를 사용하는 클래스 테스트하기
  • MockitoJUnitRunner 사용해 Mockito 코드 깔끔하게 만들기 : @Mock
  • Kotlin에서 Mockito ArgumentCaptor 사용시 java.lang.NullPointerException: argumentCaptor.capture() must not be null 나오는 현상 해결 방법
심플코드
심플코드
프로그래밍을 어렵지 않게 풀어서 설명하는 기술 블로그
    반응형
  • 심플코드
    심플코드
    심플코드
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • 안드로이드를 위한 Coroutines (2)
      • Unit Testing (19)
      • GitHub Actions (0)
      • 공식 문서 번역 (35)
        • Coroutines 공식 문서 (35)
      • 알고리즘 (7)
        • Kotlin 자료구조 (0)
        • 알고리즘 (7)
        • Kotlin으로 구현하는 자료구조 (0)
      • 코딩 테스트 (0)
      • Deep Learning (0)
      • Machine Learning Math (17)
        • Linear Algebra (17)
      • ML (0)
      • Docker (15)
      • Kubernetes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 코틀린 코루틴의 정석 책 출간 소식
  • 인기 글

  • 태그

    coroutine
    Kotlin
    컨테이너
    Docker
    Machine Learning
    junit
    코루틴 채널
    unit test
    numpy
    unit testing
    TensorFlow
    Coroutines
    도커
    pytorch
    코루틴
    Coroutines Context
    mockito
    Coroutines Flow
    Coroutines Channel
    코루틴 Flow
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
심플코드
코드 작성 시 정적 변수와 정적 메서드 사용을 지양해야 하는 이유 알아보기
상단으로

티스토리툴바