Blog

Mocking einer kollaborierenden abstrakten Klasse mit EasyMock partial mocking

Deepak Mittal

Aktualisiert Oktober 23, 2025
3 Minuten

Es kommt vor, dass wir Methoden einer konkreten Unterklasse, die mit Methoden der abstrakten Oberklasse kollaborieren, einem Unit-Test unterziehen müssen. Die wichtigste Anforderung ist, dass wir die Methoden der Unterklasse isoliert testen wollen, ohne uns um die kollaborierenden Methoden der abstrakten Oberklasse zu kümmern.

 

Schauen wir uns ein einfaches Beispiel an: Dog extends Animal.

 

// Code für Tier

[java] package com.xebia.example; public abstract class Animal { public void sit() {} public void stand() {} public abstract void expressAnger(); public void speak(String message, Integer volumeLevel) { // Hier kommt der Code für die Methode zum Aussprechen der Nachricht mit der angegebenen Lautstärke. } } [/java]

// Code für Hund

[java] package com.xebia.example; public class Dog extends Animal { public static final String ANGRY_MESSAGE = "BARK-BARK"; public void expressAnger() { speak(ANGRY_MESSAGE, 10); } } [/java]

Die Testfälle für die Klasse Animal haben wir bereits geschrieben. Jetzt ist die Klasse Dog an der Reihe - wie können wir die Methode expressAnger der Klasse Dog isoliert testen. Nun, das ist nicht schwer mit der partiellen Mocking-Funktion der EasyMock-Klassenerweiterung 2.2, die es (wie der Name schon sagt) ermöglicht, nur ausgewählte Methoden einer Klasse zu spotten.

Wenn wir uns die Methode expressAnger der Klasse Dog ansehen, wollen wir nur testen, dass die Methode speak der Klasse Animal mit den richtigen Parameterwerten aufgerufen wird. Wir müssen also die kollaborierende Methode speak spiegeln, um die Methode expressAnger unit-testen zu können.

 

Hier ist der EasyMock-Testfall, der zeigt, wie Sie dies tun können.

 

// Code für DogTest

[java] package com.xebia.example; import static org.easymock.classextension.EasyMock.createMock; import static org.easymock.classextension.EasyMock.replay; import static org.easymock.classextension.EasyMock.verify; import java.lang.reflect.Method; import junit.framework.TestCase; public class DogTest extends TestCase { // Zu testende Klasse. Auch die kollobierende Klasse. Dog dog; protected void setUp() throws Exception { super.setUp(); // Erstellen Sie eine teilweise gespottete Instanz der Klasse Dog. Die "zu spöttelnden Methoden" werden als Array übergeben. dog = createMock(Dog.class, new Method[] {Dog.class.getMethod("speak", String.class, Integer.class)}); } public void testExpressAnger() { // Setzen Sie Erwartungen. dog.speak(Dog.ANGRY_MESSAGE, new Integer(10)); // Ändern Sie den Modus. replay(dog); // Rufen Sie die zu testende Methode auf. dog.expressAnger(); // Überprüfen Sie die Erwartungen. verify(dog); } } [/java]

Der Testfall ist recht einfach - anstatt die Abhängigkeit/Kollaborationsklasse zu mocken (der übliche Fall), haben wir die Kollaborationsmethode gemockt.

 

Der gleiche Trick gilt natürlich auch, wenn Sie eine Methode einer Klasse testen möchten, die andere Methoden derselben Klasse aufruft. Sie möchten also das normale Verhalten der methodUnderTest beibehalten und andere collaboratingMethods der gleichen Klasse verspotten.

 

Fazit

 

EasyMock Partial Mocking ist sehr praktisch für Tests, wenn eine Methode einer Klasse eine Methode derselben oder einer Oberklasse aufruft und Sie Methoden der Klasse isoliert von anderen Methoden testen müssen.

Verfasst von

Deepak Mittal

Contact

Let’s discuss how we can support your journey.