최적의 캡슐화로 패키지를 구현하려고하지만 테스트 해보고 싶습니다. 한 패키지의 package-private 멤버를 다른 (친숙한) 패키지에만 표시 할 수 있습니까?다른 패키지에 대해서만 패키지 개인 클래스를 표시하려면 어떻게해야합니까?
답변
예, 가능합니다. 종류의 ...
패키지 개인 물건은 같은 패키지에서 다른 클래스로 볼 수 있지만, 반드시 같은 디렉토리.
클래스를 동일한 패키지에 있지만 다른 디렉토리 구조 (예 : 테스트 코드) 또는 다른 프로젝트 내에 배치 할 수 있습니다.
테스트를 언급 했으므로 테스트에서이 내용을보고 싶다고 가정합니다. 테스트 클래스를 프로덕션 코드와 동일한 패키지 (동일한 디렉토리이 아님)로 정의하십시오.
테스트 프로젝트를 작성하고 동일한 패키지 이름을 사용하여 성공했습니다. 그것은 작동합니다! 단위 테스트는 개발 도구 일 뿐이므로 패키지 확장으로 사용할 수 있지만 최종 제품에서는 제외된다는 점에서 개념적으로 올바른 방법이라고 생각합니다. –
정의에 따르면 패키지 전용 멤버는 패키지 외부의 클래스에서 볼 수 없습니다. 이것은 당신이 시험하고 있음에도 불구하고 당신이해서는 안되는 일을하려고 시도하고 있음을 시사합니다.
getter 또는 reflection을 사용하여 해결할 수 있지만 먼저 해당 멤버에 액세스해야하는지 여부를 먼저 확인해야합니다. 내부 상태 인 경우 테스트하지 않아야합니다. 그렇지 않은 경우 getter가 적절할 수 있습니다. 또는 테스트를 동일한 패키지에 넣을 수도 있습니다 (그러나 다른 디렉토리 트리에 저장 될 수도 있음).
나는 그것이 가능하지 않다고 생각합니다. getter를 사용하는 것이 좋습니다. – Zarwan
먼저 테스트는 테스트중인 클래스와 동일한 패키지에 있습니다. 둘째 - 내부 상태를 검사하지 마십시오. 클래스가 해당 API를 올바르게 구현하는지 확인하고 구현 세부 정보를 일반적으로 직접 테스트해서는 안됩니다. – chrylis
@ Zarwan, .NET에서이 문제를 해결하기 위해'[InternalsVisibleTo ("Tests")]'로 어셈블리를 표시 할 수 있습니다. Java에서 동등한 기능에 대한 장벽은 찾을 수 없습니다. 반영 가능하기 때문입니다. –