120 likes | 190 Views
Testen mit Mock-Objekten. Andreas Höfer Dr. Matthias Müller. Mockdummystub-Objekt?. Ein Stub ersetzt geplante, noch nicht implementierte Funktionalität. Ein Dummy-Objekt ersetzt eine echte Implementierung für Testzwecke.
E N D
Testen mit Mock-Objekten Andreas Höfer Dr. Matthias Müller
Mockdummystub-Objekt? • Ein Stub ersetzt geplante, noch nicht implementierte Funktionalität. • Ein Dummy-Objekt ersetzt eine echte Implementierung für Testzwecke. • Ein Mock-Objekt ersetzt eine echte Implementierung und verifiziert korrektes Verhalten des Klienten. • Oft wird in der Literatur nicht sauber unterschieden. Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
Vorteile von Mock-Objekten • Gut zum Testen von Protokollen, der richtigen Reihenfolge von Methodenaufrufen und den dabei übergebenen Parametern • Reduzieren Abhängigkeiten • Reduzieren Wartezeiten • Kapseln/beschreiben erwartetes Verhalten • Fördern Programmierung gegen Schnittstellen Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
Indikatoren gegen das Testen mit Mock-Objekten • Mock-Objekt enthält viel Logik statt fest verdrahteter Werte • Mock-Objekt dupliziert Anwendungslogik • Echte Objekte leicht(er) verwendbar • Mock-Objekt ruft andere Mock-Objekte auf Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
Testmuster für Mock-Objekte • Instanzen der Mock-Objekte erstellen • Zustände der Mock-Objekte setzen • Erwartete Werte der Mock-Objekte setzen • Anwendungscode mit Mock-Objekten als Parameter aufrufen • Verifizieren der erwarteten Werte in den Mock-Objekten Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
Tank public interface Tank { public void open(); public void close(); public void refuel(double amount) throws TankOverflowException; public double getFreeCapacity(); } Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
MockTank (1/2) public class MockTank implements Tank { private final static double FREE_CAPACITY = 1; private final static String EXPECTED_ORDER = "open()\ngetFreeCapacity()\nrefuel()\nclose()\n"; private String order = ""; public void open() { order += "open()\n"; } public void close() { order += "close()\n"; } public double getFreeCapacity() { order += "getFreeCapacity()\n"; return FREE_CAPACITY; } … Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
MockTank (2/2) publicdouble getFreeCapacity() { order += "getFreeCapacity()\n"; return FREE_CAPACITY; } publicvoid refuel(double amount) throws TankOverflowException { order += "refuel()\n"; Assert.assertTrue( "Tanker must avoid spillage.", amount <= FREE_CAPACITY); } public void verify() { Assert.assertEquals(EXPECTED_ORDER, order); }} Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
OilTankerTest public class OilTankerTest extends TestCase { public void testCompleteRefueling() throws Exception { MockTank mock = new MockTank(); OilTanker.refuelCompletely(mock); mock.verify(); } } Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
OilTanker public class OilTanker { public static void refuelCompletely(Tank tank) throws TankOverflowException { tank.open(); double amount = tank.getFreeCapacity(); tank.refuel(amount); tank.close(); } } Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
<<interface>> Besucher besucheElementA(ElementA) besucheElementB(ElementB) Besucher1 Besucher2 besucheElementA(ElementA) besucheElementB(ElementB) besucheElementA(ElementA) besucheElementB(ElementB) <<interface>> Element akzeptiere(Besucher) ElementA ElementB operationA() akzeptiere(Besucher b) operationB() akzeptiere(Besucher b) Besucher-Entwurfsmuster ObjektStruktur Klient b.besucheElementA(this) b.besucheElementB(this) Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller
Referenzen • Johannes LinkSoftwaretests mit JUnit2. Auflage, dpunkt.verlag, 2005 • Tim Mackinnon, Steve Freeman, Philip CraigEndo-Testing: Unit-Testing with Mock ObjectsXP2000 Konferenz, 2000 • Erich Gamma et al. Design PatternsAddison-Wesley, 1995 Testtechniken-Praktikum WS 2005/06 Andreas Höfer – Dr. Matthias Müller