2015-01-19 3 views
9

독서 후 : https://code.google.com/p/powermock/wiki/BypassEncapsulation 나는 깨닫지 못합니다.PowerMock 개인 회원 전용 액세스

이 예제를 참조하십시오 :

public class Bar{ 
    private Foo foo; 

    public void initFoo(){ 
     foo = new Foo(); 
    } 
} 

어떻게 내가 PowerMock를 사용하여 개인 회원 foo에 액세스 할 수 있습니다 (예를 들어 foo가 null가 아닌 것을 확인하기 위해)?

참고 : 내가 추가 get 방법과 코드를 수정되고 싶지 않아 무엇
.

편집 : 나는 내가 솔루션 링크 된 페이지의 샘플 코드 블록을 놓친 것을 깨달았
.

솔루션 :

Whitebox.getInternalState(bar, "foo"); 
다음 테스트 클래스 작성만큼 간단해야
+0

이 유형의 테스트를 작성하기 전에 여기에 요약 된 개인 변수의 값을 확인하는 것에 대한 논쟁을 신중하게 생각하는 것이 좋습니다. https://stackoverflow.com/questions/2981476/does-jmockit-have-any-drawbacks-at- 전체/7499979 # 7499979 – codebox

+0

실제 테스트는 좀 더 복잡하고 최대 절전 모드, 세션 및 sessionfactory 포함, 나는 완전한 최대 절전 모드 물건을 초기화하지 않고 dbInterface를 확인하려고합니다. 대부분의 메소드에서 객체 상태를 수정하고 실제 입/출력 기능이 없습니다. – Gobliins

답변

15

:

public class BarTest { 
    @Test 
    public void testFooIsInitializedProperly() throws Exception { 
     // Arrange 
     Bar bar = new Bar(); 

     // Act 
     bar.initFoo(); 

     // Assert 
     Foo foo = Whitebox.getInternalState(bar, "foo"); 
     assertThat(foo, is(notNull(Foo.class))); 
    } 
} 

권리를 추가가 (정적) 수입이 독자에게 연습 문제로 남겨 :).

+0

예 어떻게 든 페이지의 코드 샘플을 간과했습니다. 귀하의 대답은 정확합니다 – Gobliins

+1

"Arrange, Act, Assert"의견을 좋아합니다. 나는 "Setup, Test, Validate"를 사용하지만 3의 링을 좋아한다. – javaPlease42

+0

실제로 S-T-V에서 A-A-A로 전환되었습니다. 실제로 이단은 그것을 건전하게 만든다. 하지만 가장 중요한 것은 (약어로) : 테스트를 구조화하는 데 도움이되므로 실수로 SUT 대신 실수로 테스트 할 수 있습니다. 나는 그것이 일어난 것을 보았습니다 - 3 단계가 섞여서. – mthmulders