2016-08-23 4 views
4

는 최근 프로젝트를 대한 기존위한 TDD 작업을 시작하고 문제의 커플, 그 중 하나는 내가 개인 변수에 조롱 할 필요가비웃음/getter와 setter 메소드가없는 클래스의 private 변수를 스텁

아래에 언급 직면

private Class<XYZ> cls = XYZ.class; 

보다 나중에 "CLS"변수

private List create(Class className, Object objectTO, List<String> names) 

I 클래스 명

같은 방법의 하나로서 사용 arugment 같은 테스트 클래스 가변 보인다 개인 변수를 조롱 할 수 있습니다 알고 내가 아래에 따라 내 테스트 케이스에 개인 변수를 조롱은 선언

  1. java.lang.reflect.Field;
  2. Field field = PowerMockito.field(XYZ.class,"cls");
  3. field.set(XYZ.class, "objectOfXYZClass");

내가 실행 내 테스트 클래스 단계 , 오류가 발생했습니다.

java.lang.IllegalArgumentException: Can not set java.lang.Class field com.tools.XYZ.cls to java.lang.Class 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75) 
at java.lang.reflect.Field.set(Field.java:680) 

제발 누군가가 나를 도와 줄 수 있고 내가 무엇을 놓치고 있는지 알려주실 수 있습니다.

PS : 나는 @preparefortest을 사용하고있는 모든 필요한 클래스를 언급 세트 @runwith(powermockrunner.class)

답변

1
field.set(instanceOfClassXYZ, "") 

넣고, 클래스의 인스턴스를 사용하여 내 테스트 클래스를 실행. 수업이 아닙니다. 왜냐하면 "objectOfXYZClass"문자열을 객체로 설정하기 때문입니다. 아닌 클래스 클래스로) 그리고 난 당신이 장치를 얻고있다

field.setAccessible(true); 
+0

@ Sarseth..yes 나를 위해 일했다... 나쁘다, filed .set() 나는 다른 방법으로하고 있었다. .. 고마워. –

2

추가 거라고 잘못 테스트합니다. 필드 구현이나 개인 메소드와 같은 내부 구현을 테스트하는 것이 아닙니다.

단위 테스트해야 일반적으로 할 경우에만 다음 사항 : 당신은 당신은 그 객체에 공공 메소드를 호출

  • "테스트중인 클래스"당신의 객체를 생성

    1. ; 그 호출에 대한 결과를 "주장"합니다 (예를 들어 여기 저기에 특정 예외가있을 것으로 예상하는 경우 포함). 즉

    : 당신은 매우 "테스트중인 클래스"당신의 외부에서 볼 수 행동 만 테스트 할. 그리고 여러분도 알다시피 : 클래스에 외부에서 보이는 동작이없는 경우 - 왜 처음부터 있었습니까?!

    물론 때로는 "충분하지 않습니다". 이 경우, 일반적으로하는 일 : 을 조롱 한 개체를 만들기 위해 EasyMock 또는 Mockito와 같은 일부 조롱 프레임 워크를 사용합니다. 테스트중인 클래스를 인스턴스화 할 때 이러한 모의 객체를 사용합니다 (종속성 주입라고 함). 이렇게하면 테스트중인 클래스를 완전히 제어 할 수 있습니다. 예를 들어, mock이 기대하는 메소드 호출을 볼 수 있는지 확인할 수 있습니다.

    간단히 말해서 : 예, 테스트중인 클래스의 필드에 어떻게 든 액세스 할 수 있습니다. 그러나 그것은 그 이름의 가치가없는 단위 테스트로 이어집니다. 이러한 테스트는 코드 내부를 리팩터링하는 즉시 시작됩니다. 그러한 의미에서 : 이러한 테스트는 현재 구현이 예상대로 작동 함을 증명하는 데 유용합니다. 그러나 당신이 무언가를 바꿀 때마다 부품이나 테스트 코드를 재 작업해야합니다.

    마지막으로 단위 테스트를 작성하는 것은 학습해야하는 기술입니다. 그 중 가장 좋은 방법은 videos입니다.