Testing private method - Methods Should Be Public?

발생일: 2009.12.08

문제:
xper 그룹스 메일링을 받아보고 있는데,
오늘 누군가가 TDD(Test Driven Development) 진행 중 생긴 문제점에 대해 질문을 한 내용이 있다.

유닛 테스트를 위해 모든 메서드를 public 으로 선언하다보니,
"public 메서드가 너무 남발되는 게 아닌가, 객체지향의 원칙을 깨버리는 게 아닌가." 하는 생각이 들었다고 한다.

나도 예전에 같은 문제로 질문한 적이 있었는데,
그 당시에 멤버 변수는 private 으로, 메서드는 모두 public 으로 설정하는 쪽으로 결론을 냈었다.

그에 따라 (테스트를 위해) private 으로 작성된 메서드의 접근자를 단순히 모두 public 으로 바꾸는 식으로 구현했었다.
이 때는 마틴파울러의 Refactoring 책을 읽고 있어서 Replace Temp With Query 기법을 쓴답시고
마침 private 메서드가 굉장히 많을 때이기도 했다.
(결국 한 클래스에 잘게 쪼개진 public 메서드가 꽤 많이 생기게 됐다.)

헌데 요새 디자인 패턴에 대해 공부하다 보니,
요 놈들을 클래스로 빼내고 프록시 패턴이나 퍼사드 패턴을 써서 정리할 수도 있을 것 같다.


여튼, 그건 그렇고, 나도 아직 궁금하다.
과연 단지 유닛 테스트를 하기 위해서 모든 메서드를 public 으로 선언해야 할까?

해결책:
이에 대한 토론이 활발하게 있었다고 한다.

일단 토론은 'private 메서드를 어떻게 테스트 할 것인가? (Testing Private Interfaces)' 부터 시작됐겠다.

그러다 모든 메서드는 public 이어야 한다. 라는 주장이 나오게 된 듯 하다.



"모든 메서드를 Public 으로 하자"는 토론에 대해 정리해보면 아래와 같다.
(각자의 의견을 주거니 받거니 하고 있어 재밌다.^^)




어느 쪽의 의견이 맞다고는 할 수 없겠다.^^;

나는 개인적으로 private 메서드를 쓰는 걸 좋아하긴 하지만,
이 참에 한 번 모든 메서드를 public 으로 쓰는 쪽으로 시도해보려고 한다.

단순히 private 제한자를 public 으로 replace 하는 것 말고,
디자인 자체를 변경하면서 말이다.


그렇다면 어떻게 적용해야 할까....?
위 토론 중에도 있던 내용인데, 참고가 될 것 같아 내용을 덧붙여 적어본다.







카테고리

분류 전체보기 (710)
About me. (6)
Daylogs (675)
영어공부 (0)
My works - 추억 (29)
비공개 (0)