[JAVA] So verspotten Sie einen Super-Methodenaufruf in PowerMock

Einführung

In JUnit mit Mockito und Powermock musste ich die Verarbeitung der übergeordneten Klasse mit super verspotten, also habe ich es mir notiert. Wenn Sie nachschlagen, können Sie sehen, dass Sie "PowerMockito.suppress ()" verwenden können. Wenn Sie jedoch "unterdrücken ()" verwenden, wird es nur übersprungen und Sie sollten das erwartete Scheinobjekt zurückgeben. Es befand sich in einem Zustand, in dem die nachfolgende Verarbeitung von JUnit nicht erfolgreich ausgeführt werden konnte.

Getestete Klasse

Der Beispielcode ist unten dargestellt. Die DTO-Klasse wird weggelassen.

Übergeordnete Klasse

public class Parent {

	public OutputDto execute (InputDto input) {
		System.out.println("Parent#execute()");
		OutputDto out = new OutputDto();
		out.setText(input.getText());
		return out;
	}
}

Kinderklasse

public class Child extends Parent {

	public OutputDto execute (InputDto input) {
		System.out.println("Child#execute()");
		OutputDto out = super.execute(input);
		out.setText(out.getText()+" updated in Child.");
		return out;
	}
}

Der Punkt ist, dass in der untergeordneten Klasse "super.execute ()" ausgeführt wird und der Rückgabewert erwartet wird.

JUnit-Testklasse

@RunWith(PowerMockRunner.class)
@PrepareForTest({Parent.class})//Geben Sie das übergeordnete Element an
public class MockSuperTest {

	//Getestete Klasse
	@InjectMocks
	private Child child;

	@Before
	public void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);
	}

	@Test
	public void testExecute1() {
		//Vorbereitung der Eingabedaten
		InputDto input = new InputDto();
		input.setText("hello");
		OutputDto result = new OutputDto();
		result.setText("hello updated in Child.");

		try {
			Method method = child.getClass().getMethod("execute", InputDto.class);
			PowerMockito.replace(method).with(
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("replaced execute()!!");
						return result;
					}
				});
		} catch (Exception e) {
			e.printStackTrace();
			fail();
		}

		OutputDto testOut = child.execute(input);
		assertEquals(result.getText(), testOut.getText());
	}
}

Ausführungsergebnis

Wenn Sie die obige JUnit ausführen,

Child#execute()
replaced execute()!!

Nach dem Aufruf der untergeordneten Klasse "execute ()" wird "super.execute ()" durch den durch "PowerMockito.replace ()" angegebenen Inhalt ersetzt.

Apropos,

@PrepareForTest({Child.class})//Geben Sie ein Kind an
public class MockSuperTest {

Wenn Sie den Ort in der untergeordneten Klasse angeben, ist das Ergebnis

replaced execute()!!

Ändern Sie direkt die benachbarte untergeordnete Klasse execute (). Natürlich, wenn Sie es normal ausführen

Child#execute()
Parent#execute()

Ist der erwartete Wert.

das ist alles.

Recommended Posts

So verspotten Sie einen Super-Methodenaufruf in PowerMock
So testen Sie eine private Methode und verspotten sie teilweise in Java
So erstellen Sie eine Methode
Rufen Sie die Super-Methode in Java auf
So fügen Sie ein Video in Rails ein
Wie man Parameter in der link_to-Methode hat
Speichern der im Textbereich eingegebenen Informationen in einer Variablen in der Methode
So veröffentlichen Sie eine Bibliothek in jCenter
So verweisen Sie auf eine Spalte, wenn Sie die Spaltennamensmethode in ActiveRecord überschreiben
Wie man jeden Fall mit PowerMock + Mockito1x verspottet
So zeigen Sie eine Webseite in Java an
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So erstellen Sie ein Thema in Liferay 7 / DXP
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
So generieren Sie automatisch einen Konstruktor in Eclipse
So rufen Sie AmazonSQSAsync auf
So erstellen Sie eine Beurteilungsmethode, um nach einem beliebigen Zeichen im Array zu suchen
Aufrufen von Funktionen in großen Mengen mit Java Reflection
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
Ich möchte eine Methode einer anderen Klasse aufrufen
So implementieren Sie eine nette Funktion in Ajax mit Rails
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
So erstellen Sie einen Daten-URI (base64) in Java
So starten Sie einen anderen Befehl in einem Ruby-Programm
So zeigen Sie eine Browser-Vorschau mit VS-Code an
[So fügen Sie ein Video mit Rails in haml ein]
So schreiben Sie eine Datumsvergleichssuche in Rails
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
Wie hinterlasse ich einen Kommentar?
So fügen Sie ein Video ein
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Verwendung der Getter / Setter-Methode (in Objektorientierung)
So ändern Sie eine Zeichenfolge in einem Array in eine Zahl in Ruby
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Ich möchte eine Methode aufrufen und die Nummer zählen
Speichern von Zeichenfolgen von ArrayList zu Zeichenfolge in Java (Personal)
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Aufrufen und Verwenden der API in Java (Spring Boot)
So wählen Sie ein bestimmtes Datum anhand des Codes im FS-Kalender aus
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
So fügen Sie dieselben Indizes in ein verschachteltes Array ein
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
So entwickeln und registrieren Sie eine Sota-App in Java
Super einfach in 2 Schritten! So installieren Sie devise! !! (Schienen 5 Version)
So simulieren Sie das Hochladen von Post-Object-Formularen in OSS in Java
So erstellen Sie ein Service Builder-Portlet in Liferay 7 / DXP
So richten Sie einen Proxy mit Authentifizierung in Feign ein
Verwendung der link_to-Methode
Wie man Lombok im Frühling benutzt
So finden Sie May'n in XPath
Verwendung der include? -Methode