2010-05-25 9 views
27

Quando uso il seguente test ottengo a AVVISO:JMockit - problema di inizializzazione

WARNING: JMockit stato inizializzato su richiesta, che può causare alcuni test per sicuro; si prega di controllare la documentazione per i modi migliori per farlo inizializzato.

Questa è la mia prova implemenation:

package test; 

import static mockit.Mockit.*; 
import junit.framework.TestCase; 
import mockit.*; 
import mockit.integration.junit4.*; 


import org.junit.*; 
import org.junit.runner.*; 

import filip.ClassUnderTest; 
import filip.LowerClass; 

@RunWith(JMockit.class) 
public class MockTest extends TestCase { 

    @MockClass(realClass = LowerClass.class) 
    public static class LowerClassMock { 
     @Mock(invocations = 1) 
     public String doWork() { 
      return "Mockowanie dziala :D"; 
     } 
    } 

    @Before 
    public void setUp() { setUpMocks(LowerClassMock.class); } 

    @After 
    public void tearDown() { tearDownMocks(); } 

    @Test 
    public void testJMockit() { 
     ClassUnderTest classUnderTest = new ClassUnderTest(); 

     classUnderTest.print(); 
    } 

} 

Tutte le idee?

risposta

15

Come ho capito, questa eccezione è thrown quando si tenta di chiamare un metodo JMockit, mentre JMockit non è stato inizializzato correttamente.

assicurarsi di seguire il JMockit installation instructions, in particolare punti 3 e 4. Se il vaso JMockit arriva dopo il vaso JUnit nel classpath, potrebbe causare problemi.

+1

Sembra che utilizzando le librerie di juint incorporate di eclipse ci sia qualche problema con JMockit. La risoluzione è di aggiungere jar JUnit esterno e separato. – Filip

+1

Il collegamento alle istruzioni di installazione di JMockit in questa risposta accettata è rotto! – fatuhoku

+0

@FatuHoku Grazie. Aggiornato il link. –

34

La risposta accettata è un po 'obsoleta rispetto ai collegamenti, quindi vale la pena menzionare direttamente le varie soluzioni.

Per risolvere il problema effettuare una delle seguenti:

1 - Specificare un un javaagent

Aggiungi questo al vostro ambiente di esecuzione JUnit (per la versione):

-javaagent:path/to/your/jmockit/jmockit-0.998.jar 

2 - configurare il plugin Surefire in Maven per evitarlo

Aggiungere il seguente alla configurazione Maven (scegliere le proprie versioni)

<!-- JMockit must be before JUnit in the classpath --> 
<dependency> 
    <groupId>mockit</groupId> 
    <artifactId>jmockit</artifactId> 
</dependency> 
<!-- Standard unit testing --> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
</dependency> 

Assicurarsi che il plugin infallibile è configurato come segue (per le versioni particolari):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.4.3</version> 
    <configuration> 
     <argLine>-javaagent:${settings.localRepository}/mockit/jmockit/0.998/jmockit-0.998.jar</argLine> 
     <useSystemClassLoader>true</useSystemClassLoader> 
    </configuration> 
</plugin> 

3 - Usa l'annotazione JUnit @RunWith

Aggiungi questa annotazione JUnit su ogni test c lass

@RunWith(JMockit.class) 
public class ExampleTest {} 
+0

Sto usando Maven, quindi sto provando a usare l'opzione 2. Tuttavia, nonostante assicuri che jmockit è la prima dipendenza del mio pom e il plugin surefire è configurato per usare il -javaagent argLine, sto ancora ottenendo il "initialized" su richiesta "attenzione. Sto usando surefire 2.6 e jmockit 0.999.4. Qualche idea? – Greg

+0

Forse combinato anche con l'opzione 3? –

+0

@GregInYEG, hai mai funzionato? Ho lo stesso identico problema. – Ilkka

2

Oltre a Gary Rowe di solution:

Una più robusta (vale a dire la versione e il percorso del repository agnostica) integrazione dei JMockit in infallibile sarebbero

<argLine>-javaagent:${org.jmockit:jmockit:jar} 

Per fare questo lavoro risoluzione, l'esperto di dipendenza-plugin (versione> = 2.5.1!) Deve essere configurato in questo modo:

<plugin> 
<artifactId>maven-dependency-plugin</artifactId> 
<version>2.5.1</version> 
<executions> 
    <execution> 
     <id>getClasspathFilenames</id> 
     <goals> 
      <goal>properties</goal> 
     </goals> 
    </execution> 
</executions> 

0

ho semplicemente aggiunto:

@RunWith (JMockit.class)

che ha risolto il problema, come per la documentazione nel accettata risposta.

+0

Questo non funzionerà con JUnitParams o qualsiasi altra cosa che richiede RunWith – Novaterata

0

Ancora non funziona per me in IntelliJ. Sono in grado di eseguirlo a linea di comando però.

Problemi correlati