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
'IT Share you' 카테고리의 다른 글
Linux에서 일반적인 ./configure는 무엇을합니까? (0) | 2020.11.24 |
---|---|
XDocument에서 XML을 문자열로 얻는 방법은 무엇입니까? (0) | 2020.11.24 |
Python에서 목록이어야하는 매개 변수의 기본값을 설정하는 모범 사례? (0) | 2020.11.24 |
오류 대신 문자열 던지기 (0) | 2020.11.24 |
matplotlib 기본값을 변경하지 않고 어떻게 seaborn을 사용할 수 있습니까? (0) | 2020.11.24 |