2012-11-02 6 views
7

Sto tentando di testare una classe con un numero di classi private (sì, so che questo è generalmente considerato una cattiva pratica per la testabilità, ma questa domanda non riguarda i principi di progettazione). La mia classe sarebbe simile a questa:PowerMock può istanziare una classe interna per i casi di test?

public class EnclosingClass { 
    . 
    . 
    . 
    private class InnerClass implements InnerClassType { 
    public InnerClass(){ /* do stuff */} 
    public int InnerClassMethod(); 
    } 
} 
  • InnerClassType è un'interfaccia pubblica

Ho provato istanziare le classi con powermock facendo:

Class clazz = Whitebox.getInnerClassType(EnclosingClass.class, "InnerClass"); 
Constructor constructor = Whitebox.getConstructor(clazz, null); 
InnerClassType innerClass = (InnerClassType) constructor.newInstance(null); 

e anche:

Class clazz = Whitebox.getInnerClassType(EnclosingClass.class, "InnerClass"); 
InnerClassType innerClass = (InnerClassType) Whitebox.invokeConstructor(clazz); 

Tuttavia, in entrambi i tentativi ottengo un ConstructorNotFoundException

È possibile creare un'istanza di queste classi interne? Se sì, dove sto andando male?

risposta

6

Dovreste essere in grado di superare il vostro ConstructorNotFoundExeception tramite i seguenti mods al primo sforzo:

Class clazz = Whitebox.getInnerClassType(EnclosingClass.class, "InnerClass"); 
Constructor constructor = Whitebox.getConstructor(clazz, EnclosingClass.class); 
InnerClassType innerClass = (InnerClassType) constructor.newInstance(new EnclosingClass()); 

Dal momento che la classe interna non è statico, si aspetta implicitamente un "questo" di riferimento della classe esterna. Utilizzando questo metodo, sembra che tu debba esplicitare con esso.

+0

Funziona perfettamente - questo pulisce sicuramente la mia unità! – JoshC13

+0

Dato che InnerClass è privato, come si può ottenere InnerClassType ?? –