2013-03-04 2 views
3

내가 이전에 물어 본 this question과 관련하여, 나는 내 단위 테스트로 다시 붙어 있습니다.단위 테스트를 위해 보호 된 메소드에 액세스해야합니까?

현재 내 문제는 클래스의 protected 메소드를 테스트하는 것과 관련이 있습니다.

나는 추상적 클래스가 가진 모든 것을 상속받는 일을 아주 잘 수행하는 모의 클래스 인 ConcreteComponent을 성공적으로 구현했다.

사실,이 콘크리트 클래스를 내 단위 테스트 파일 안에 만들었습니다. 보호 된 메서드를 테스트하는 유일한 방법은 Private Accessor를 사용하는 것입니다. 그러나 단위 테스트가있는 곳과 동일한 파일에 Private Accessor를 만들 수 없으므로 보호 된 메서드에 액세스 할 수 없습니다.

모의 구체적인 클래스를 다른 네임 스페이스 아래에 별도의 파일에 배치하려고 했으므로 이제 단위 테스트 파일을 사용할 수있는 개인용 액세서를 만들 수 있습니다. 그것은 훌륭하게 작동했지만, 그런 다음 유닛 테스트가있는 동일한 파일 안에이 모의 구체적인 클래스가 필요하다고 생각했습니다.

그래서 지금은 두 가지 질문이 있습니다

1)이 문제에 대한 가능한 해결 방법은 무엇입니까?

2) 유닛 테스트 클래스와 동일한 파일 및 네임 스페이스 내에있는 모의 클래스에 대한 private 접근자를 만들 수없는 이유는 무엇입니까?

+0

"왜 당신이 안되 냐"는 좋은 질문입니다. 너 왜 그럴 수 없어? 정확히 무슨 일이 일어나고 있습니까? – JRoughan

+0

잘 VS2008 그 이유는 무엇이든 나를 허용하지 않습니다. 클래스가 유닛 테스트와 동일한 파일에있을 때 모의 클래스의 이름을 마우스 오른쪽 버튼으로 클릭 할 때 Private Accessor를 만드는 옵션이 없습니다. 그러나 모의 클래스를 별도의 파일에 배치하면 Private Accessor를 만드는 옵션이 나타납니다. – Anthony

+0

아, 그래서 IDE가 당신을 내버려 두지 않습니다. MSTEST 및 자동 생성 접근자를 사용하고 있다는 것을 깨닫지 못했습니다. 이 경우 아래의 Saurabh의 조언을 따르고 공개 인터페이스가 보호 된 코드를 실행하고 있는지 확인합니다. 그렇지 않은 경우, 깨진 경우에도 문제가되는 이유는 무엇입니까? – JRoughan

답변

0

클라이언트에 노출시키고 싶지 않으므로 보호 된 기능이 있습니다. 하지만 보호 된 경우 공용 인터페이스를 통해 몇 가지 만족 조건을 통해 액세스 할 수 있습니다. 그렇지 않으면 죽은 코드이므로 제거하십시오.

그래서 황금 규칙은

1, 단위 테스트를 비공개로 시도 (반사 등) 기술을 사용하여/개인 보호 방법을 테스트 회피하려고하지 마십시오/공용 인터페이스를 통해 보호와 BTW 이유를 사용하는 VS 2008 테스트와 NUnit을 사용하지 않는 이유

+1

리팩토링 기능을 다른 클래스에 리팩터링하여 추가 할 수 있으므로 자체 테스트가 가능합니다. –

+0

Seconded; 개인용 메소드는 공용 인터페이스를 통해 간접적으로 테스트해야하며, 그렇지 않으면 새 클래스로 추출해야합니다. –

+0

에 대한 보호 된 방법을 사용하면 "클라이언트"는 기본 calss에서 파생 된 클래스가 될 수 있으므로 보호 된 메서드에 액세스 할 수 있습니다. 보호 된 메소드는 객체의 소비 인터페이스의 일부입니다. 비록 당신이 개인적인 방법보다는 보호 된 방법에 대해 이야기하고 있다면 당신의 주장에 완전히 동의합니다. –

2

PrivateObject 클래스를 살펴보고 테스트에서 클래스의 비공개 API에 액세스 할 수 있습니다. 내부적으로 리플렉션을 사용합니다. 클래스의 보호 된 자산은 여전히 ​​외부 클라이언트에 대한 API이며이 경우 하위 클래스 또는 파생 클래스입니다. 그런 api를 테스트하려는 욕망은 이해할 수 있습니다. 보호 된 API를 테스트하기 위해 공개 API를 공개하는 클래스를 오염시키지 않는 것이 좋습니다. 그러나 파생 된 클래스가 테스트 프로젝트에 있기 때문에 실제로 공용 API를 제공하여 테스트를 더 쉽게하고 성능을 향상시킬 수 있습니다 (반영이 느려지고 테스트를 실행하는 경우 지속적인 테스트, 코드 변경, 시험 횟수 등에 따라 시험 운전이 느려질 수 있습니다.)

+0

+1은 PrivateObject 클래스를 참조합니다. 최상위 정격 응답이 좋지만, 나는 이것이 upvoted되지 않은 것이 놀랍다! – Arj

+0

선생님, 방금 내 인생을 바 꾸었습니다! –

관련 문제