IT Share you

JUnit 테스트 개인 변수?

shareyou 2020. 11. 24. 20:35
반응형

JUnit 테스트 개인 변수?


JUnit으로 직접 작업 한 적이없는 클래스를 단위 테스트하는 작업이 할당되었으며 패키지의 코드를 변경하는 것은 엄격히 금지되어 있습니다. 대부분의 단위 테스트는 루틴을 실행하고 반환 값을 확인하여 간단하게 수행 할 수있는 기능 및 입력 / 출력 일관성을위한 것이므로 일반적으로 문제가되지 않습니다.

그러나 때때로 클래스 내에서 개인 변수를 확인하거나 일부 내부 동작을 확인하기 위해 개인 변수를 직접 편집해야 할 필요가 있습니다. 원래 소스 패키지의 코드를 실제로 변경하지 않고 단위 테스트 목적으로 JUnit을 통해 또는 다른 방법으로 액세스 할 수있는 방법이 있습니까? 그렇지 않다면, 단위 테스터가 코더와 같은 사람이 아닐 수있는 현실 세계에서 프로그래머는이 문제를 어떻게 처리할까요?


예, 리플렉션을 사용하여 개인 변수에 액세스 할 수 있습니다. 좋은 생각은 아니지만.

이것 좀 봐:

http://en.wikibooks.org/wiki/Java_Programming/Reflection/Accessing_Private_Features_with_Reflection


우선, 당신은 이제 나쁜 위치에 있습니다. 원래 만들지 않은 코드에 대한 테스트를 작성하고 변경 사항없이-악몽입니다! 당신의 상사와 이야기하고 설명하십시오. 코드를 "테스트 가능"하지 않고는 테스트 할 수 없습니다. 코드를 테스트 가능하게 만들기 위해 일반적으로 몇 가지 중요한 변경을 수행합니다.

개인 변수에 관해서. 실제로 그렇게해서는 안됩니다. 개인 변수 테스트를 목표로하는 것은 현재 디자인에 문제가 있다는 첫 번째 신호입니다. 개인 변수는 구현의 일부이며 테스트는 구현 세부 사항보다는 동작에 초점을 맞춰야합니다.

때로는 개인 필드가 일부 getter를 사용하여 공개 액세스에 노출됩니다. 나는 그렇게하지만 가능한 한 피하려고 노력합니다 ( '테스트에 사용됨'과 같은 주석에 표시).

코드를 변경할 가능성이 없기 때문에 개인 변수를 확인할 가능성 (Reflection hacks 등이 아닌 실제 가능성을 의미 함)이 보이지 않습니다.


반사 예 :

public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
    this.privateString = privateString;
  }
}
PrivateObject privateObject = new PrivateObject("The Private Value");

Field privateStringField = PrivateObject.class.
            getDeclaredField("privateString");

privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

명백한 것을 말할 위험에도 불구하고 : 단위 테스트를 사용하면 개체의 올바른 동작을 테스트하고 싶습니다. 이것은 공용 인터페이스 측면에서 정의됩니다. 객체가이 작업을 수행하는 방법에 관심이 없습니다. 이것은 구현 세부 사항이며 외부에서 볼 수 없습니다. 이것이 OO가 발명 된 이유 중 하나입니다. 구현 세부 사항이 숨겨져 있습니다. 따라서 비공개 멤버를 테스트 할 필요가 없습니다. 100 % 보장이 필요하다고 말씀하셨습니다. 객체의 공용 인터페이스를 사용하여 테스트 할 수없는 코드가있는 경우이 코드는 실제로 호출되지 않으므로 테스트 할 수 없습니다. 그것을 제거하십시오.


다음은이 문제 만 해결하는 문서입니다 (특히 테스트 관련).

http://onjava.com/pub/a/onjava/2003/11/12/reflection.html


비공개 필드에 대해 테스트해야하는 특수 사례 코드를 찾았는지 알 수 없습니다. 하지만 내 경험상 당신은 절대로 비공개로 테스트 할 필요가 없습니다. 비공개로 테스트해야하는 코드의 예를 제공 할 수 있습니까?


별도의 폴더에 테스트 클래스를 만든 다음 빌드 경로에 추가하면

그런 다음 package를 올바르게 사용하여 네임 스페이스를 설정하여 테스트 클래스를 테스트중인 클래스의 내부 클래스로 만들 수 있습니다. 이것은 개인 필드와 메소드에 대한 액세스를 제공합니다.

그러나 릴리스 빌드의 빌드 경로에서 폴더를 제거하는 것을 잊지 마십시오.

참고 URL : https://stackoverflow.com/questions/6694715/junit-testing-private-variables

반응형