2013-09-27 12 views
9

Vorrei utilizzare Powermock con Mockito per simulare alcune chiamate al metodo statico. Ho seguito le istruzioni e gli esempi da SO così come le pagine PowerMock Getting Started e MockStatic come meglio posso, ma devo ancora completare una chiamata a mockStatic().Impostazione di Powemockito per derisione statica

Quando chiamo mockStatic (foo.class) della mia classe di prova, mi sono dato l'excception:

java.lang.NoClassDefFoundError: org/Mockito/mock/MockName 
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) 
at ...my test class method call... 

Sono sicuro che questo è un problema di impostazione, come mi è stato trovare la terminologia utilizzata per averlo impostato è abbastanza confuso. Ho preso il Mockito Zip dal PowerMock downloads. In Eclipse (3.5.2) ho aperto le proprietà del progetto e aggiunto tutti i jar al percorso di generazione. Ho anche provato ad aggiungere l'intera cartella powermockito decompressa al mio classpath vars di ambiente, e quindi solo il jar powermockito in particolare quando non ha funzionato.

ho questi annotationsat la classe a livello della mia classe di test e, secondo le istruzioni powermock:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ApplicationContextLoader.class) 

anche questi specifici powermock importazioni:

import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

a quelli di voi che hai già usato PowerMockito, anche solo un puntatore nella giusta direzione, o qualcosa da verificare sarebbe davvero utile. Sto faticando a vedere come la mia configurazione differisce da quella dei post che ho visto usando - da quello che posso dire - la stessa sintassi.

+0

Hai mai trovato una soluzione? – Dave

+0

Non che io ricordi, anche se sono passati un paio d'anni. Ho la risposta di @Walls upvoted, quindi deve essere stato il massimo aiuto, a meno di una soluzione. – Ubunfu

risposta

3

Se si utilizza un oggetto fittizio statico, nell'annotazione PrepareForTest, aggiungere la classe che sta USANDO l'oggetto statico oltre alla classe statica stessa. Se la classe che si sta testando deve utilizzare questa statica, aggiungere la classe corrente all'annotazione. In realtà non prendi in giro la classe, ma deve essere nell'annotazione perché la statica si agganci. Sembra strano, ma funziona.

Quando si aggiungono più classi nell'annotazione, è possibile averli all'interno di {} e separati da virgole. Per esempio, se la classe statica è StaticA.class e la classe utilizzando la statica è CallerOfStatic.class è possibile utilizzare:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({StaticA.class, CallerOfStatic.class}) 
+0

Grazie, ho appena provato che fuori, facendo i miei annotazioni simile a questa: '@RunWith (PowerMockRunner.class) @PrepareForTest ({ApplicationContextLoader.class, \t \t TestClass.class}) public class TestClass {codice della classe ..test ...} ' – Ubunfu

+0

@Ubunfu ha funzionato :) ??? – Walls

+0

Haha, a quanto pare ero troppo occupato a cercare di rendere leggibile quella parte. Ma no, non sembra fare alcuna differenza. – Ubunfu

24

Probabilmente, le versioni di Powermock e Mockito non sono compatibili. Risolvilo e non sarà più un problema.

Mockito      PowerMock 
1.10.8+      1.6.2+ 
1.9.5-rc1 - 1.9.5   1.5.0 - 1.5.6 
1.9.0-rc1 & 1.9.0   1.4.10 - 1.4.12 
1.8.5      1.3.9 to 1.4.9 
1.8.4      1.3.7 & 1.3.8 
1.8.3      1.3.6 
1.8.1 & 1.8.2    1.3.5 
1.8       1.3 
1.7       1.2.5 

See: https://github.com/jayway/powermock/wiki/MockitoUsage

0

Assicurarsi che le versioni powermockito e Mockito allineati come in questo grafico - https://github.com/jayway/powermock/wiki/MockitoUsage#supported-versions,

modo semplice per trovare è,

mvn dependency:tree | grep mockito 
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile 
[INFO] +- org.mockito:mockito-all:jar:1.9.5:compile 
[INFO] +- org.powermock:powermock-api-mockito:jar:1.5.6:compile 

Nel mio caso, powermock 1.5.6 e mockito 1.9.5 erano allineati ma dovevano cambiare per usare mockito 1.8.5, come qualcuno nessun altro nella dipendenza stava già usando mockito 1.8.5.

seguente combinazione funziona perfettamente per me,

mvn dependency:tree | grep mockito 
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile 
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile 
[INFO] +- org.powermock:powermock-api-mockito:jar:1.4.9:compile 
Problemi correlati