2012-09-10 5 views
10

Ich versuche, die Ins und Outs von verschiedenen Mocking-Bibliotheken zu lernen und PowerMock (speziell die EasyMock-Erweiterung) ist der nächste auf der Liste. Ich versuche, einen Konstruktor zu verspotten, und die angegebenen Beispiele haben nicht die gleiche Antwort, wenn ich versuche, sie zu replizieren. Soweit ich das beurteilen kann, macht es dem Konstrukteur nie etwas vor und geht einfach so vor, als wäre es normal.PowerMocks expectNew() verspottet einen Konstruktor nicht wie erwartet

Dies ist die Testklasse:

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

} 

ich mit einem EasyMock.isA (String.class), um den "Test" versucht haben, zu ersetzen, aber es ergab die gleichen Ergebnisse.

Dies ist 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"; 
    } 
} 

Der "Writer" ist nichts anderes als eine Schale einer Klasse:

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

    public Writer() throws IOException{ 
    } 
} 

Wenn der Test durchgeführt wird, druckt es aus „ohne Wurf zurück msgstr "" "Die Angabe der Ausnahme wurde nie ausgelöst.

Antwort

21

Sie müssen die Klasse vorzubereiten, die den Konstruktor als auch ruft, so PowerMock einen verspottete Konstruktoraufruf erwarten kennt. Versuchen Sie, Ihren Code mit den folgenden zu aktualisieren:

+1

Danke, ich habe nicht bemerkt, dass das Objekt, das den Konstruktor aufgerufen hat, ebenfalls enthalten sein muss. – AdamSpurgin

+0

Ich lief in dasselbe Problem ... Genau, was ich vermisste :) –

+0

Vielen Dank, ich kämpfte lange, bis ich diese Antwort fand. – OQJF

1

Sie müssen zuerst ein Mock-Objekt erstellen:

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

Ich versuche nicht, ein Mock-Objekt zu erstellen, ich versuche, den Konstruktor abzufangen und eine Ausnahme an seiner Stelle zu werfen. Der Abschnitt "Weitere Funktionen" auf [dieser Seite] (http://code.google.com/p/powermock/wiki/MockConstructor) ist, was ich anstrebe. – AdamSpurgin

+1

Entschuldigung, ich sehe was Sie versuchen zu tun. Ich habe gerade Ihren Code auf JUnit 4 ausprobiert und es wird "von Mock geworfen" gedruckt (was Sie erwarten würden). Verwenden Sie TestNG zufällig? Ich bin nicht vertraut mit TestNG, aber wenn ich es mit TestNG lief, bekam ich "ohne werfen" –

+0

Ich benutze Junit4. Ich kann mir nichts vorstellen, was dazu führen könnte, dass es nicht funktioniert. – AdamSpurgin