2011-01-27 8 views
5

Usando JMockit 0.999.4 y JDK6, ¿es posible depurar en una clase parcialmente burlada?Debug Moial parcial en JMockit

Considérese la siguiente prueba:

@Test 
public void testClass() { 
    SampleClass cls = new SampleClass(); 

    System.out.println(cls.getStaticInt()); 
    cls.setVal(25); 
    System.out.println(cls.getVal()); 
} 

static class SampleClass { 
    static int staticInt = 5; 
    private int val; 

    { 
     staticInt = 10; 
    } 

    public int getStaticInt() { 
     System.out.println("Returning static int and adding a line for debugging"); 
     return staticInt; 
    } 

    public void setVal(int num) { 
     System.out.println("Setting val and adding a line for debugging"); 
     this.val = num; 
    } 

    public int getVal() { 
     System.out.println("Returning val and adding a line for debugging"); 
     return this.val; 
    } 
} 

La colocación de un punto de interrupción en cada una de las líneas sysout en SampleClass y depurar "Paso a paso" en Eclipse entrará en los métodos SampleClass.

considere lo siguiente, lo que impide el inicializador estático de fijar staticInt a un valor de 10.

@Test 
public void testClass(@Mocked(methods = "$clinit") SampleClass cls) {  

    System.out.println(cls.getStaticInt()); 
    cls.setVal(25); 
    System.out.println(cls.getVal()); 
} 

static class SampleClass { 
    static int staticInt = 5; 
    private int val; 

    { 
     staticInt = 10; 
    } 

    public int getStaticInt() { 
     System.out.println("Returning static int and adding a line for debugging"); 
     return staticInt; 
    } 

    public void setVal(int num) { 
     System.out.println("Setting val and adding a line for debugging"); 
     this.val = num; 
    } 

    public int getVal() { 
     System.out.println("Returning val and adding a line for debugging"); 
     return this.val; 
    } 
} 

Sin embargo, este código no depurar en los métodos de SampleClass.

Sí, he probado la propiedad -javaagent.

Respuesta

7

Respondido por Rogerio en el JMockit Google's discussion group.

La JVM descarta los puntos de interrupción definidos en una clase después de que se redefine (que JMockit hace cada vez es burlado una clase).

Para restablecer los puntos de interrupción, detenga el depurador en el método de prueba, solo antes de ingresar el código bajo prueba. Es decir, establezca un punto de interrupción en el método de prueba , en la línea que llama a "SampleClass" en este ejemplo .

+0

Para los curiosos, este es el enlace de error JVM: https://bugs.openjdk.java.net/browse/JDK-7036136 –

+0

Ni siquiera puedo establecer un punto de interrupción directamente en el método de prueba unitaria. Estoy usando jdk 1.8 y Eclipse Mars (4.5.1). ¿Alguien más tiene el mismo problema y una solución? – Joern

+0

Ahora encontré la diferencia con la prueba anterior. Estoy usando la anotación '@ Probado' en un método miembro. Si reemplazo esto creando el SUT manualmente en un método '@ Before', los puntos de interrupción en la clase de prueba funcionan correctamente. – Joern