2015-09-23 17 views
18

Ich benutze PowerMock und ich würde gerne wissen, wie alle Verhalten der Kindklasse zu halten, aber stub super Anrufe, die vom Kind überschrieben werden können.PowerMock: Stub Methoden von Elternklasse

Sagen, ich habe diese Klasse:

public class A { 
    public String someMethod() { 
     return "I don't want to see this value"; 
    } 
} 

und eine Unterklasse:

public class B extends A { 
    @Override 
    public String someMethod() { 
     return super.someMethod() + ", but I want to see this one"; 
    } 
} 

Wie Stummel ich den Anruf zu super.someMethod()?

Ich habe

versucht
@Test 
public void test() { 
    B spy = PowerMockito.spy(new B()); 
    PowerMockito.doReturn("value").when((A)spy).someMethod(); 

    assertEquals("value, but I want to see this one", spi.someMethod()); 
} 
+0

Was passiert im aktuellen Testfall? – Keith

+0

Es stößt die Methode der Unterklasse ab. – jchitel

+1

Scheint wie dieser Fehler: https: //github.com/jayway/powermock/issues/487 – javaPlease42

Antwort

1

Die Besetzung Sie versuchen, wird nicht funktionieren, wie Sie erwarten. Ich denke jedoch, dass Sie ein paar Möglichkeiten haben, um dies zu umgehen, sicherlich mit PowerMockito.

Werfen Sie einen Blick auf diese StackOverflow answer.

+1

Ja, also habe ich wirklich versucht, eine Lösung zu finden, weil der Sinn von PowerMock ist, dass Sie nicht ändern müssen Die Struktur Ihres Codes, um ihn testbar zu machen. Ich habe jedoch festgestellt, dass ich das mit dem Aufwand vergleichen muss, der für das Schreiben der Tests erforderlich ist. Daher habe ich den Code so geändert, dass er einfacher zu testen ist. Aber danke für die Ressource! – jchitel

1

Sie können versuchen, die Methoden aus der übergeordneten Klasse zu unterdrücken,

PowerMockito.suppress(methodsDeclaredIn(A.class)); 

Hier ist ein Artikel auf Stubbing, zu unterdrücken und das Ersetzen mit PowerMock, die von Nutzen sein könnte.

https://www.jayway.com/2013/03/05/beyond-mocking-with-powermock/

+0

Die 'suppress' Methode ist nicht hilfreich, da ich einen verspotteten Wert zurückgeben muss. Trotzdem danke. – javaPlease42

+0

Wie funktioniert die Verwendung von PowerMockito.replace(), um die Methode "Eltern" durch eine Methode zu ersetzen, die den Wert des Mocks zurückgibt? – Steve

2

Vergessen Sie nicht @PrepareForTest({ParentClassToSupress.class}) auf Ihrer Testklasse hinzuzufügen. Dann können Sie tun, wie Steve vorschlägt und Methoden in der Eltern unterdrücken: PowerMockito.suppress(methodsDeclaredIn(ParentClassToSupress.class));

Verwandte Themen