2012-09-10 10 views
10

Sto cercando di imparare i dettagli di varie librerie di derisione e PowerMock (in particolare l'estensione di EasyMock) è il prossimo sulla lista. Sto tentando di prendere in giro un costruttore e gli esempi forniti non hanno la stessa risposta quando provo a replicarli. Per quanto posso dire, non prende in giro il costruttore e procede come se fosse normale.L'aspettativa di PowerMock() non sbeffeggia un costruttore come previsto

Questa è la classe di test:

@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); 
    } 

} 

Ho provato a sostituire il "test" con un'EasyMock.isA (String.class), ma essa fece gli stessi risultati.

Questa è la 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"; 
    } 
} 

Il "Writer" non è altro che un guscio di una classe:

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

    public Writer() throws IOException{ 
    } 
} 

Quando il test viene eseguito, esso stampa "tornato senza lancio ", indicando che l'eccezione non è stata mai lanciata.

risposta

21

è necessario preparare la classe che chiama il costruttore e, in modo PowerMock sa di aspettarsi una chiamata al costruttore deriso. Prova ad aggiornare il tuo codice con:

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

Grazie, non mi sono reso conto che l'oggetto che ha chiamato il costruttore doveva essere incluso. – AdamSpurgin

+0

Mi sono imbattuto nello stesso problema ... Proprio quello che mi mancava :) –

+0

Grazie mille, ho faticato a lungo finché non ho trovato questa risposta. – OQJF

1

È necessario creare prima un oggetto fittizio:

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

Non sto cercando di creare un oggetto fittizio, sto tentando di intercettare il costruttore e lanciare un'eccezione al suo posto. la sezione "Altre funzionalità" di [questa pagina] (http://code.google.com/p/powermock/wiki/MockConstructor) è ciò a cui tengo. – AdamSpurgin

+1

scusa, vedo cosa stai cercando di fare. Ho appena provato il tuo codice su JUnit 4 e viene stampato "gettato via" (cosa ti aspetteresti). Stai usando TestNG per caso? Non ho familiarità con TestNG ma quando l'ho eseguito utilizzando TestNG, ho ricevuto "restituito senza throw" –

+0

Sto usando Junit4. Non riesco a pensare a nulla che possa far sì che non funzioni. – AdamSpurgin