2016-10-03 6 views
1

최적의 캡슐화로 패키지를 구현하려고하지만 테스트 해보고 싶습니다. 한 패키지의 package-private 멤버를 다른 (친숙한) 패키지에만 표시 할 수 있습니까?다른 패키지에 대해서만 패키지 개인 클래스를 표시하려면 어떻게해야합니까?

+1

나는 그것이 가능하지 않다고 생각합니다. getter를 사용하는 것이 좋습니다. – Zarwan

+1

먼저 테스트는 테스트중인 클래스와 동일한 패키지에 있습니다. 둘째 - 내부 상태를 검사하지 마십시오. 클래스가 해당 API를 올바르게 구현하는지 확인하고 구현 세부 정보를 일반적으로 직접 테스트해서는 안됩니다. – chrylis

+0

@ Zarwan, .NET에서이 문제를 해결하기 위해'[InternalsVisibleTo ("Tests")]'로 어셈블리를 표시 할 수 있습니다. Java에서 동등한 기능에 대한 장벽은 찾을 수 없습니다. 반영 가능하기 때문입니다. –

답변

1

예, 가능합니다. 종류의 ...

패키지 개인 물건은 같은 패키지에서 다른 클래스로 볼 수 있지만, 반드시 같은 디렉토리.

클래스를 동일한 패키지에 있지만 다른 디렉토리 구조 (예 : 테스트 코드) 또는 다른 프로젝트 내에 배치 할 수 있습니다.

테스트를 언급 했으므로 테스트에서이 내용을보고 싶다고 가정합니다. 테스트 클래스를 프로덕션 코드와 동일한 패키지 (동일한 디렉토리이 아님)로 정의하십시오.

+0

테스트 프로젝트를 작성하고 동일한 패키지 이름을 사용하여 성공했습니다. 그것은 작동합니다! 단위 테스트는 개발 도구 일 뿐이므로 패키지 확장으로 사용할 수 있지만 최종 제품에서는 제외된다는 점에서 개념적으로 올바른 방법이라고 생각합니다. –

1

정의에 따르면 패키지 전용 멤버는 패키지 외부의 클래스에서 볼 수 없습니다. 이것은 당신이 시험하고 있음에도 불구하고 당신이해서는 안되는 일을하려고 시도하고 있음을 시사합니다.

getter 또는 reflection을 사용하여 해결할 수 있지만 먼저 해당 멤버에 액세스해야하는지 여부를 먼저 확인해야합니다. 내부 상태 인 경우 테스트하지 않아야합니다. 그렇지 않은 경우 getter가 적절할 수 있습니다. 또는 테스트를 동일한 패키지에 넣을 수도 있습니다 (그러나 다른 디렉토리 트리에 저장 될 수도 있음).