2014-04-10 13 views
11

Ho sviluppato un'applicazione in Java e sto provando a creare test di unità usando Powermockito (dovrei aggiungere che sono nuovo al test dell'unità).Powermockito doNothing per il metodo con argomenti

ho una classe denominata risorsa che ha un metodo chiamato statico readResources:

public static void readResources(ResourcesElement resourcesElement); 

ResourcesElement è anche codificata da me. Nel test, voglio creare la mia risorsa, quindi voglio che il metodo sopra non faccia nulla. Ho provato utilizzando questo codice:

PowerMockito.spy(Resource.class); 
    PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)); 

Il test di unità genera un'eccezione:

org.mockito.exceptions.misusing.UnfinishedStubbingException: stubbing grezzo rilevato qui: -> a org.powermock .api.mockito.internal.PowerMockitoCore.doAnswer (PowerMockitoCore.java:36)

Powermockito suggeriscono anche che dovrei usare thenReturn o thenThrow dopo quando, ma sembra che il metodo 'when' ritorni vuoto quando viene chiamato dopo doNothing (che è logico). Se provo:

PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class))..... 

DoNothing non è un'opzione dopo il quando.

Sono riuscito a rendere i metodi senza argomenti per non fare nulla, utilizzando la versione a 2 argomenti del metodo. Ad esempio:

PowerMockito.doNothing().when(Moduler.class, "startProcessing"); 

Questo funziona (startProcessing non accetta argomenti).

Ma come posso creare metodi che accettano argomenti per non fare nulla con Powermockito?

risposta

13

È possibile trovare qui sotto un esempio completamente funzionale. Poiché non hai pubblicato l'esempio completo, posso solo supporre che tu non abbia annotato la classe di test con @RunWith o @PrepareForTest perché il resto sembra soddisfacente.

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Resource.class}) 
public class MockingTest{ 

    @Test 
    public void shouldMockVoidStaticMethod() throws Exception { 
     PowerMockito.spy(Resource.class); 
     PowerMockito.doNothing().when(Resource.class, "readResources", Mockito.any(String.class)); 

     //no exception heeeeere! 
     Resource.readResources("whatever"); 

     PowerMockito.verifyStatic(); 
     Resource.readResources("whatever"); 
    } 

} 

class Resource { 
    public static void readResources(String someArgument) { 
     throw new UnsupportedOperationException("meh!"); 
    } 
} 
+0

Grazie, è stato così, ho dimenticato di annotare con @PrepareForTest (il mio altro esempio funzionava perché mi sono ricordato di annotare). – Anakin001

+0

Nessun problema, mi è successo un paio di volte e ho perso alcune ore cercando di capirlo – Morfic

+0

@ Anakin001: Cosa succede se il metodo ** "readResources" ** è privato e non statico in questo caso? –

0

Forse non riesco a capire la tua domanda, ma credo sia necessario specificare che cosa deve fare il metodo , quindi se non si specifica thenReturn o thenThrow o quant'altro powerMockito non sa cosa fare quando leggi il tuo il codice vero e proprio, ad esempio:

vERO cODICE:

  IPager pag; 
     IPagerData<List<IDeute>> dpag; 
     pag = new PagerImpl(); 
     pag.setFiles(nombrefilesPaginador); 
     pag.setInici(1); 
     dpag = gptService.obtenirDeutes(idSubjecte, idEns, tipusDeute, periode, pag); 

test codice reale da Mockito:

 IPager pag = new PagerImpl(); 
     pag.setInici(1); 
     pag.setFiles(0); 
     when(serveiGpt.obtenirDeutes(eq(331225L), 
     eq(IConstantsIdentificadors.ID_ENS_BASE), 
     Matchers.any(ETipusDeute.class), 
     Matchers.any(EPeriodeDeute.class), 
     eq(pag))) 
     .thenThrow(new NullPointerException(" Null!")); 

Se non hanno specificare il reso il mio test fallirà. Spero che aiuti.

+1

Grazie per la risposta. Non posso restituire nulla poiché il mio metodo non restituisce nulla. Inoltre, non voglio fare un'eccezione. Voglio solo che il metodo non faccia nulla. – Anakin001

1

Se doNothing() non funziona si può incidere un po 'con il PowerMockito.doAnswer(). Questo ti permette di prendere in giro metodi void che dovrebbero fare qualcosa, come valori di impostazione, ecc. Se doNothing() non funziona, usare uno spazio vuoto doAnswer() dovrebbe funzionare correttamente.

Esempio:

PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() { 
    @Override 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     return null; //does nothing 
    } 
}).when(mockObject).methodYouWantToDoNothing(args); 
+1

Funziona, grazie, ma il problema era che avevo dimenticato di annotare con @PrepareForTest, come suggerito Grove. Tuttavia, ottima risposta e lo terrò a mente per il futuro (non sapevo di doAnswer). – Anakin001

1

perché passare attraverso tanti guai solo in modo che il metodo non fa nulla. Basta chiamare lo PowerMockito.mockStatic(Resource.class) per sostituire tutti i metodi statici della tua classe con gli stub predefiniti, il che significa sostanzialmente che non fanno nulla.

A meno che non si desideri modificare il comportamento del proprio metodo per eseguire effettivamente qualcosa, è sufficiente chiamare PowerMockito.mockStatic(Resource.class). Ovviamente questo significa anche che tutti i metodi statici nella classe vengono soppressi, che è necessario considerare.

Problemi correlati