2011-09-20 12 views
22

Sto cercando di utilizzare Powermock e Mockito per simulare un metodo statico di annullamento per generare un'eccezione come di seguito. Ma ho incontrato un problema. A meno che non crei le due invocazioni di Adder.add() con lo stesso argomento, il mocked IOException non verrà lanciato.Come simulare un metodo statico di annullamento per generare un'eccezione con Powermock?

BTW, ho aggiunto @RunWith(PowerMockRunner.class) e @PrepareForTest(Adder.class) alla classe di test dell'unità.

class Adder{ 
    public static void add(int i) throws IOException{ 
     return; 
    } 
} 

@Test 
public void testAdder() throws IOException{ 
    PowerMockito.mockStatic(Adder.class); 
    PowerMockito.doThrow(new IOException()).when(Adder.class); 
    Adder.add(12); 
    try { 
     Adder.add(11); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // assert things 
} 

Grazie in anticipo. :)

La risposta è come di seguito.

Dopo aver consultato qui http://code.google.com/p/powermock/issues/detail?id=278, infatti Adder.add (12) sopra è parte dell'impostazione del metodo statico simulato. Significa quando si richiama Adder.add() con argomento 12, verrà generata IOException. È difficile da capire, giusto? :) Quindi dovrebbe essere scritto come sotto.

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class); 
Adder.add(anyInt()); 

risposta

23

La risposta è come di seguito.

Dopo aver consultato qui http://code.google.com/p/powermock/issues/detail?id=278, infatti Adder.add (12) sopra è parte dell'impostazione del metodo statico simulato. Significa quando si richiama Adder.add() con argomento 12, verrà generata IOException. È difficile da capire, giusto? :) Quindi dovrebbe essere scritto come sotto.

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class); 
Adder.add(anyInt()); 

EDIT:
Link è morto, provare Internet Archive uno invece.

+2

Questo non è affatto intuitivo. Faticato per farlo funzionare. Grazie per il consiglio. – Dhiraj

+1

Si noti che 'Adder.add (anyInt());' non è ciò che attiva qui l'eccezione, la applica alle chiamate a 'Adder.add()'. – sjngm

0

Hai dimenticato di mettere PowerMock in modalità riproduzione?

How to Mock Static methods.

Per il tuo link ...

Come verificare il comportamento verifica di un metodo statico avviene in due fasi. Prima chiamata PowerMockito.verifyStatic() per iniziare a verificare il comportamento e chiamare il metodo statico che si desidera verificare. Per esempio.

PowerMockito.verifyStatic(); 
Static.firstStaticMethod(param); 

Importante: è necessario chiamare verifyStatic() per verifica del metodo.

+0

ho letto il tutorial qui da quando sto usando Mockito. http://code.google.com/p/powermock/wiki/MockitoUsage13 Non menziona che devo usare la modalità replay. – Smartmarkey

+0

Oops. Ho visto PowerMockito e ho letto PowerMock. –

+0

Modificato per il collegamento –

1

O

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12)); 
Problemi correlati