2009-09-30 4 views
2

나는 여러 가지 개인 메소드로 클래스를 단위 테스트하려고합니다. 개인적인 방법은 각각 광범위 할 수 있습니다.단위 테스트시 자바 액세스 백도어 대체에 대한 대안

I 중 하나를 수행 할 수 있습니다 방법 패키지 (이 경고가 발생) 범위, 또는 내가 테스트 아래의 코드를 사용할 수 있도록 : 클래스는 "하나님 개체"아닙니다

Method method = instance.getClass().getDeclaredMethod("methodName"); 
method.setAccessible(true); 
Object object = method.invoke(instance); 
assertNotNull(object); 

및 대부분의 메서드는 모든 필드를 터치합니다.

어떻게 처리 할 수 ​​있는지에 대한 제안 사항이 있으십니까?

답변

11

개인적인 방법을 테스트하는 것은 테스트 냄새 일 수도 있습니다.

내 참조 대신 방법의 테스트 행동으로 생각하는 훌륭한 책 http://www.manning.com/rainsberger/

  1. 입니다 : 입도는 조금 다르다.

    예제 1 : 더미를 테스트하려면 pushpop을 서로 참조하지 않고 어떻게 테스트합니까? 그러나 세계적인 행동을 테스트하는 것이 가능합니다. 이것은 테스트를 위해 객체가 올바른 세분성이 아니라 메소드임을 상기시켜줍니다.

    예제 2 : 여러 객체 간의 상호 작용을 테스트하려는 경우 메소드별로 테스트하는 방법이 분명하지 않으므로 전역 동작을 테스트하고 싶습니다.

  2. 메서드가 public이 아닌 경우 외부에서 호출 할 수 없으며 그 동작이 덜 엄격하게 정의됩니다. 그러나 모든 것 이상으로 개인적인 방법을 테스트하면 나중에 코드를 리팩토링 할 수 없습니다. 따라서 테스트는 공개 코드에서만 수행해야합니다.

+2

모든 개인 메서드는 사용되지 않으므로 코드 기반에서 제거하거나 공용 메서드 (또는 여러 공용 메서드)로 호출해야하며 공용 메서드 입력은 모든 공용 메서드를 테스트하도록 설계해야합니다. 공공의 방법으로 –

+1

+1 "테스트 냄새". 몇 가지 개인 메소드가 많은 경우, 클래스를 작은 클래스로 분할하여 각각이 개인 메소드의 서브 세트를 가져와야합니다. 그런 다음 (일부)이 메소드는 public 메소드가 될 수 있습니다. – sleske

0

아직 사용하지 않으면 스트레칭이 될 수 있지만 Groovy는 단위 테스트를위한 액세스 제한을 위반하는 데 정말 좋습니다 ... 메소드를 호출하고 호출하지 않고 메소드를 호출하면됩니다. 추가 반사.

0

범위 메서드를 패키지화 할 때 어떤 경고가 발생하는지 궁금하지만, 어쨌든 이런 종류의 문제를 해결하는 방법은 테스트를 개체의 정적 내부 클래스로 만드는 것입니다. 이것은 절충점을 가질 수 있습니다. 배포 크기가 중요한 문제인 경우 실수로 테스트 프레임 워크에서 프로덕션 코드로 종속성을 도입 할 때주의해야 할 경우 코드가 패키지화되지 않도록 클래스를 제외해야 할 수도 있습니다.

또 다른 잠재적 인 옵션은 필요한 메서드를 노출하는 데 도움이되는 정적 내부 클래스를 갖는 것이고 테스트에서는이를 개인 메서드에 대한 통과로 사용합니다. 여기서 단점은이 클래스가 본질적으로 클래스를 사용하고자하는 모든 사람들에게 개인 메소드를 노출한다는 것입니다. 따라서이 클래스는 테스트 목적으로 만 사용된다는 것을 명확하게 표현해야합니다.

1

KLE가 맞습니다.

그러나 레거시 코드로 작업하고 개인 메서드에서 종속성을 처리해야하는 경우 마지막 도랑 옵션은 JMockit입니다. 나는 그것을 사용하지 않았지만 그것에 대해 The Art of Unit Testing에서 읽었다. 원래 클래스에서 가짜 클래스로 호출을 바꿀 수 있어야합니다.

다른 메서드에 대한 종속성을 없애기 위해 이것을 사용하여 개인 메서드를 테스트하지 않고 공용 메서드를 테스트 할 수 있습니다. 그리고 분리 된 디자인으로 리팩터링하는 과정에서 안전망으로 사용하십시오.

+0

좋은 +1. – KLE

관련 문제