Wie zum Hohn geschützt Unterklasse die geerbten Methode aus der abstrakten Klasse?
Wie zu verwenden Mockito oder PowerMock zu verspotten, eine protected-Methode, realisiert durch eine Unterklasse, aber geerbt von der abstrakten super-Klasse?
In anderen Worten, ich möchte testen "doSomething" - Methode, während die Verspottung der "doSomethingElse".
Abstrakten super-Klasse
public abstract class TypeA {
public void doSomething() {
//Calls for subclass behavior
doSomethingElse();
}
protected abstract String doSomethingElse();
}
Unterklasse Umsetzung
public class TypeB extends TypeA {
@Override
protected String doSomethingElse() {
return "this method needs to be mocked";
}
}
Lösung
Antworten, die hier gegeben werden sind richtig und wird funktionieren, wenn alle beteiligten Klassen im gleichen Paket.
Aber wenn verschiedene Pakete beteiligt sind, ist eine option, um Benutzer PowerMock. Das folgende Beispiel funktionierte für mich. Natürlich könnte es andere Möglichkeiten, es zu tun, das ist eine, die funktioniert.
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ TypeB.class })
public class TestAbstract {
@Test
public void test_UsingPowerMock() throws Exception {
//Spy a subclass using PowerMock
TypeB b = PowerMockito.spy(new TypeB());
String expected = "some value for mock";
//Mock a method by its name using PowerMock again
PowerMockito.doReturn(expected).when(b, "doSomethingElse");
//Calls the
String actual = b.doSomething();
assertEquals(expected, actual);
}
}
Hinweis: Tests mit Java 5, jUnit 4.11, Mockito 1.9.0 und PowerMock 1.4.12.
NullPointerException
mit Java 8, JUnit 4.12 und PowerMock 1.6.4.InformationsquelleAutor BonanzaOne | 2015-08-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
Mockito.CALLS_REAL_METHODS
wenn die Verspottung der abstrakten Methode. Dies ruft den originalen Methoden von der Klasse und Sie verspotten Sie alle abstrakten Methoden von selbst.Oder testen Sie direkt auf die TypeB mit einem Spion:
spy()
aber wenn ich versuche es in meinem Produktions-code, es gibt mirThe method <method name> from the type <subclass name> is not visible
. Um herauszufinden, warum.Eigentlich dein test korrekt ist, aber ich habe die Klassen in verschiedene Pakete, das ist, warum ich war nicht in der Lage, es früher zu tun. Methoden, die nicht sichtbar sind von anderen Paketen, wenn geschützt.
Habe die 1. option funktioniert auch? Ich habe beide getestet mit Mockito 1.10.19 und die Letzte beta-version und beide funktionieren wie erwartet.
In der Tat es funktioniert. Habe vergessen zu sagen, meine Mockito version ist uralt, 1.9.0, weil von Java 5.
InformationsquelleAutor mszalbach
Schlage ich vor, mit Mockito:
Dies macht es ein problem. Eine mögliche Lösung wäre die Verwendung von PowerMock, die sollten in der Lage sein zu überprüfen, in privaten Methoden, afaik. Nie benutzt, obwohl.
InformationsquelleAutor Florian Schaetz
Können Sie testen Sie Ihre abtract-Klasse mit mockito in der folgenden Weise
InformationsquelleAutor jozzy
Zu verspotten Methoden, die void zurückgibt, in abstrakten Klassen, die wir verwenden könnten:
Können wir ersetzen Argumente mit Mockito.anyString() etc wie pro Anforderungen.
InformationsquelleAutor Virtual