2015-01-19 14 views
9

Dopo aver letto: https://code.google.com/p/powermock/wiki/BypassEncapsulation ho capito, non capisco.membri privati ​​di accesso PowerMock

vedere in questo esempio:

public class Bar{ 
    private Foo foo; 

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

Come posso accedere al membro privato foo utilizzando PowerMock (ad esempio per verificare che foo non è null)?

Nota:
Quello che non voglio è la modifica del codice con get metodi aggiuntivi.

Edit:
mi sono reso conto che ho perso un blocco di codice di esempio nella pagina collegata con la soluzione.

Soluzione:

Whitebox.getInternalState(bar, "foo"); 
+0

Mi raccomando di riflettere attentamente prima di scrivere questo tipo di test, argomenti contro il controllo del valore della variabile privata riepilogato qui: https://stackoverflow.com/questions/2981476/does-jmockit-have-any-drawbacks-at- all/7499979 # 7499979 – codebox

+0

Il test reale è un po 'più complesso e comporta l'ibernazione, la sessione e la sessionefactory, provo a controllare il nostro dbInterface senza dover inizializzare il materiale di ibernazione completo. Nella maggior parte dei metodi modifichiamo uno stato di oggetti e non abbiamo una reale funzionalità di input/output. – Gobliins

risposta

15

che dovrebbe essere semplice come scrivere la seguente classe di test:

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))); 
    } 
} 

aggiungendo la giusta importazioni (statici) viene lasciato come esercizio per il lettore:).

+0

Sì, ho trascurato in qualche modo l'esempio di codice sulla pagina. La tua risposta è corretta – Gobliins

+1

Mi piacciono i commenti "Disponi, agisci, asserisci". Io uso "Setup, Test, Validate" ma come l'anello del 3 As. – javaPlease42

+0

In realtà sono passato da S-T-V a A-A-A. L'allitterazione lo rende davvero carino. Ma la cosa più importante (con entrambe le abbreviazioni): ti aiuta a strutturare il tuo test, rendendo più difficile testare accidentalmente la tua simulazione anziché il tuo SUT. L'ho visto accadere, a causa del fatto che le tre fasi erano miste. – mthmulders

Problemi correlati