인프런 커뮤니티 질문&답변

Summer Kim님의 프로필 이미지
Summer Kim

작성한 질문수

김영한의 실전 자바 - 기본편

캡슐화

매서드 캡슐화와 테스트 코드

해결된 질문

작성

·

449

·

수정됨

2

선생님, 안녕하세요.

내부에서만 사용하는 매서드는 private으로 캡슐화 해두는 것이 좋은 구현이라고 알고 있고, 이번 수업에서도 그런 내용을 확인할 수 있었는데요,

 

private 매서드들도 테스트 코드를 작성해서 테스트 해보고싶은 경우가 자주 발생합니다... 이런 경우 고민을 하다가 몇 가지 방법이 있겠으나 ... 그냥 public 으로 열어버리고 테스트 코드를 두곤 했는데요, 이런 경우에 선생님은 실무에서 어떻게 하셨는지, 가장 좋은 practice가 무엇인지 알고 싶습니다.

 

항상 감사합니다..^^

 

답변 1

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Summer Kim님

이런 경우 정답이 있다기 보다는 몇가지 선택지가 있습니다.

1. private 메서드를 테스트하지 않는다: 일반적으로 private 메서드는 공개 인터페이스를 통해 간접적으로 테스트됩니다. 즉, public 또는 protected 메서드를 통해 private 메서드의 동작이 올바르게 수행되는지 확인합니다. 이 접근 방식의 핵심 아이디어는 클래스의 공개 인터페이스가 올바르게 작동한다면, 내부 구현(즉, private 메서드)도 올바르게 작동한다고 가정하는 것입니다.

2. 리플렉션을 사용: 자바의 리플렉션 API를 사용하면 private 메서드에 접근하여 테스트할 수 있습니다. 하지만 이 방법은 코드의 복잡성을 증가시키고, 유지보수를 어렵게 만드는 단점이 있습니다.

JUnit 5와 ReflectionTestUtils, PowerMock 등을 사용하면 private 메서드를 테스트 할 수 있습니다

3. 패키지-프라이빗 접근 제한자 사용: private 대신 package-private (기본 접근 제한자, 아무 키워드도 사용하지 않음)를 사용하면, 같은 패키지 내의 다른 클래스들이 이 메서드에 접근할 수 있습니다. 단 이 방법은 테스트 코드를 같은 패키지 내에 위치시켜야 합니다. (패키지 위치만 같으면 됩니다.)

간단하게 정리해서 말씀드리자면 private 메서드는 테스트 하지 않는 방법이 가장 좋은 방법입니다. 하지만 그래도 꼭 private을 테스트 해야 하는 상황이라면 2,3번을 선택적으로 고려하시면 됩니다.

감사합니다.

Summer Kim님의 프로필 이미지
Summer Kim

작성한 질문수

질문하기