2010-05-25 19 views
27

Cuando uso la siguiente prueba de recibo una advertencia:JMockit - problema de inicialización

ADVERTENCIA: JMockit se ha inicializado en la demanda, lo que puede causar ciertas pruebas fallen; por favor revise la documentación para mejores formas de inicializarlo.

Esta es mi prueba 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(); 
    } 

} 

¿Alguna idea?

Respuesta

15

Según tengo entendido, esta excepción es thrown cuando se intenta llamar a un método JMockit, mientras que JMockit no se ha inicializado correctamente.

asegúrese de seguir el JMockit installation instructions, especialmente los puntos 3 y 4. Si el frasco JMockit viene después el frasco JUnit en la ruta de clase, podría causar problemas.

+1

Parece que usando las bibliotecas juint incorporadas en eclipse hay algún problema con JMockit. La resolución es agregar un jar JUnit externo y separado. – Filip

+1

¡El enlace de instrucciones de instalación de JMockit en esta respuesta aceptada está roto! – fatuhoku

+0

@FatuHoku Gracias. Actualizado el enlace –

34

La respuesta aceptada ha quedado un poco desactualizada con respecto a los enlaces, por lo que vale la pena mencionar directamente las distintas soluciones.

Para solucionar este problema, realice una de las siguientes opciones:

1 - specifiy un javaagent

Agregar a su entorno de ejecución JUnit (para su versión):

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

2 - configure el complemento Surefire en Maven para evitarlo

Añadir lo siguiente a su configuración de Maven (elegir sus propios versiones)

<!-- 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> 

Asegúrese de que el plug-in de éxito seguro se configura de la siguiente manera (por sus particulares versiones):

<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 - Utilice la anotación JUnit @RunWith

Agregue esta anotación JUnit runner en cada prueba c lass

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

Estoy usando maven, así que estoy tratando de usar la opción 2. Sin embargo, a pesar de asegurar que jmockit es la primera dependencia en mi pom y el plugin surefire está configurado para usar el -javaagent argLine, todavía estoy recibiendo el "initialized" bajo demanda "advertencia. Estoy usando surefire 2.6 y jmockit 0.999.4. ¿Algunas ideas? – Greg

+0

¿Quizás combinar con la opción 3 también? –

+0

@GregInYEG, ¿alguna vez lo hiciste funcionar? Tengo el mismo problema exacto. – Ilkka

2

Además de Gary Rowe de solution:

A más robusta (es decir, versión y agnóstico integración de JMockit ruta del repositorio) en éxito seguro serían

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

Para hacer este trabajo de resolución, el experto-dependencia-plugin (versión> = 2.5.1!) Necesita ser configurado de esta manera:

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

0

simplemente agregué:

@RunWith (JMockit.class)

que se resolvió el problema, según la documentación en el aceptada responder.

+0

Esto no funcionará con JUnitParams o cualquier otra cosa que requiera RunWith – Novaterata

0

Todavía no funciona para mí en IntelliJ. Sin embargo, puedo ejecutar la línea de comandos.