2012-09-10 14 views
10

Estoy tratando de aprender los pormenores de varias bibliotecas de burlas y PowerMock (específicamente la extensión EasyMock) es el siguiente en la lista. Estoy intentando burlarme de un constructor y los ejemplos proporcionados no tienen la misma respuesta cuando trato de replicarlos. Por lo que puedo decir, nunca se burla del constructor y simplemente procede como si fuera normal.PowerNeck's expectNew() no se burla de un constructor como se esperaba

Esta es la clase de prueba:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Writer.class}) 
public class FaultInjectionSituationTest { 

    @Test 
    public void testActionFail() throws Exception { 
     FaultInjectionSituation fis = new FaultInjectionSituation(); 
     PowerMock.expectNew(Writer.class, "test") 
      .andThrow(new IOException("thrown from mock")); 
     PowerMock.replay(Writer.class); 
     System.out.println(fis.action()); 
     PowerMock.verify(Writer.class); 
    } 

} 

He intentado reemplazar la "prueba" con un EasyMock.isA (String.class), pero arrojó los mismos resultados.

Este es el FaultInjectionSituation:

public class FaultInjectionSituation { 

    public String action(){ 
     Writer w; 
     try { 
      w = new Writer("test"); 
     } catch (IOException e) { 
      System.out.println("thrown: " + e.getMessage()); 
      return e.getLocalizedMessage(); 
     } 
     return "returned without throw"; 
    } 
} 

El "escritor" no es más que una cáscara de una clase:

public class Writer { 
    public Writer(String s) throws IOException { 
    } 

    public Writer() throws IOException{ 
    } 
} 

Cuando se realiza la prueba, imprime "devolvió sin lanzamiento ", indicando que la excepción nunca fue lanzada.

Respuesta

21

lo necesario para preparar la clase que está llamando al constructor y, por lo PowerMock sabe que le espera una llamada al constructor burlado. Intente actualizar su código con lo siguiente:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Writer.class, FaultInjectionSituation.class}) 
public class FaultInjectionSituationTest { 
// as before 
} 
+1

Gracias, no me di cuenta de que el objeto que llamaba al constructor debía incluirse también. – AdamSpurgin

+0

Me encontré con el mismo problema ... Precisamente lo que me faltaba :) –

+0

Muchas gracias, luché por un largo tiempo hasta que encontré esta respuesta. – OQJF

1

Es necesario crear primero un objeto de burla:

Writer mockWriter = PowerMock.createMock(Writer.class) 
PowerMock.expectNew(Writer.class, "test").andReturn(mockWriter) 
+0

No estoy tratando de crear un objeto falso, estoy intentando interceptar el constructor y lanzar una excepción en su lugar. la sección "más funciones" de [esta página] (http://code.google.com/p/powermock/wiki/MockConstructor) es lo que pretendo. – AdamSpurgin

+1

lo siento, veo lo que estás tratando de hacer. Acabo de probar tu código en JUnit 4 y se imprime "arrojado de la burla" (lo que cabría esperar). ¿Estás usando TestNG por casualidad? No estoy familiarizado con TestNG pero cuando lo ejecuté usando TestNG, obtuve "devuelto sin tiro" –

+0

Estoy usando Junit4. No se me ocurre nada que pueda hacer que no funcione. – AdamSpurgin

Cuestiones relacionadas