////
Search
Duplicate
🛏️

Chapter 10. 테스트 하네스에서 이 메소드를 실행할 수 없다

테스트 대상 클래스를 테스트 하네스에서 생성할 수 있게 되었다면 다음은 메소드를 실행해야 한다.
대체로 메소드에 대한 테스트 루틴을 작성하기 위해 필요한 작업량은 그렇게 많지 않으며 이 과정에서 부딪칠 수 있는 문제는 다음과 같다.
메소드를 테스트 루틴에서 접근할 수 없는 경우, private나 그 밖의 가시성 문제
메소드 호출에 필요한 매개변수를 생성하기 어려운 경우
메소드에 부정적인 부작용 때문에 실행이 불가능한 경우
메소드가 사용하는 객체들을 사전에 감지해야 하는 경우

숨어있는 메소드

레거시 클래스 내의 메소드를 변경해야 하는데, 그 메소드가 private 메소드일 경우 어떻게 해야할까?
public 메소드를 통해 테스트 가능할지 검토해봐야 한다. 가능하다면 시도해볼 가치가 있다.
그렇지 않은 경우, 테스트하려면 그 메소드를 public으로 만들어야 한다.
public으로 만드는 것이 꺼려진다면 이는 곧 클래스가 너무 많은 책임을 가지고 있음을 의미하며 수정이 필요함을 뜻한다.
private 메소드를 public으로 만드는 것이 왜 우리를 고민하게 만들까? 다음과 같은 이유들이 있다.
이 메소드는 단지 유틸리티다. 즉 호출 코드는 이 메소드를 신경 쓰지 않는다.
호출 코드에서 이 메소드를 직접 사용하는 경우, 클래스의 다른 메소드의 결과에 영향을 미칠 수 있다.
이 경우, private 메소드를 신규 클래스로 옮긴 후, 이 메소드를 public으로 선언함으로써 기존 신규 클래스에서 인스턴스를 생성할 수 있다.

언어의 편리한 기능

이 경우는 보통 final, sealed와 같은 키워드가 붙어 보안의 이유로 해당 클래스를 직접 생성하지 못하게 만드는 경우 해당한다.
메소드 호출에 필요한 매개변수를 생성하기 위해 메소드 매개변수를 해당 클래스의 상위 클래스로의 타입 변경해볼 수 있다.
해당 경우, 테스트 대역 클래스를 만들어 메소드 호출에 적절한 객체를 제공해줄 수 있다.

탐지 불가능한 부작용

GUI에 뭔가를 표시한다거나 데이터베이스 조작이 발생하는 경우가 해당한다.
테스트를 위해서 해당 부작용에 의존적인 부분과 그렇지 않은 부분을 분리해야 한다.
즉, 메소드 추출 기법을 사용해 리팩토링을 적극 수행하여 테스트 가능하게 범위를 제한하는 것이 필요하다.