Unit-Testen mit Mocks

fastjack

Top Contributor
Hallo,

angenommen ich habe folgende grob skizzierte Klassen:

Java:
package a;
class A1 implements A {
    public MyComplexResult compute(int i) {
        MyComplexResult mcr = ...
        // sehr komplexe Berechnung mit DB Zugriff etc. etc.
        return mcr;
    }
} 

package b;
class B1 implements b {
    private A a1 = ...
    // z.B. wird a1 im Konstrukter von b1 gesetzt.

    public boolean evaluate(int i, String s) {
        // Berechnungen ...
        MyComplexResult mcr = this.a1.compute(i);
        // weitere Berechnungen ...
        boolean b = ...
        return b;
    }
}

Man kann nun Unittests für a1 schreiben, die die Methode compute() testen, soweit kein Problem.
Auch für B1 lassen sich Unittests schreiben, man kann A1 sehr leicht "wegmocken", indem man einfach einen Mock in den Konstruktor von B1 gibt. Dadurch kann ich ein bereits "richtiges" Ergebnis als Grundlage für meinen Test der Methode evaluate() benutzen, ohne die "komplexen" Berechnungen wirklich auszuführen. Auch kein Problem ;) Das sind alles Unittests.

Jetzt stellt sich mir folgende Frage: Was passiert, wenn jemand die Funktionalität von A1 so ändert, das das MyComplexResult mit völlig anderen Werten befüllt ist und den Test von B1 NICHT anpaßt.
Auf Unitebene würde das überhaupt niemandem auffallen, B1 würde immer noch durchlaufen, da es ja mit den für B1 "richtigen" Grundlagen arbeitet. Das wäre nicht der Fall, wenn A1 nicht weggemockt werden würde, dann würde B1 sofort Fehler beim Testen geben.

Ich vermute hier müßten Integrationstests greifen. Aber dann müßten Unittests UND Integrationstests geschrieben werden, wobei man sich dann fragen könnte, ob die Mocktests wirklich einen Zweck haben.

Was denkt Ihr dazu ?

Hoffentlich ist es verständlich :)

Danke.
 

FArt

Top Contributor
Man muss sich immer die Frage stellen: was will ich mit dem Test erreichen? Wie kritisch ist der Code? Wie oft gibt es Änderungen?

Prinzipiell sind Unit-Tests für sehr klein Bereiche gedacht. Dass man da mit Mocks und Vorbedingungen arbeitet ist ok. Man kann aber sehr gut mit JUnit auch weit darüber hinausgehende Tests realisieren. Das ist eine Frage der Handhabbarkeit. Wenn der Gesamtdurchlauf "compute" eine Stunde dauert, ist das sicher nichts mehr für den regelmäßigen Build. Wenn das (und das ist nicht unrealistisch) auch mal mehrere Stunden dauert, ist das u.U. auch nichts mehr für eine CI-Build oder Nightly-Build, auch wenn die Sicherheit, die man dadurch bekommt natürlich wächst.
 
M

maki

Gast
Ich vermute hier müßten Integrationstests greifen. Aber dann müßten Unittests UND Integrationstests geschrieben werden, wobei man sich dann fragen könnte, ob die Mocktests wirklich einen Zweck haben.
Mocks nutzt man nur in isolierten Unittests, Integrationstests nutzen keine.
Ansonsten: Ja, ob Klassen/Komponenten im verbund miteinander funktionieren erfährt man nur im Integrationstest.

Isolierte Unittests sind speziell (und nur mit Mocks oder Stubs sind sie wirklich isoliert), gehören zu den Whiteboxtests und testen das zu testende Subjekt isoliert, sind sehr nützlich, aber ersetzen keine Integrationstests, man braucht beide Testarten.
 

Andi_CH

Top Contributor
In deinem Fall wird ja der Unit Test Abweichungen melden - wenn du dann diesen Anpasst und vergisst dass andere Tests auch angepasst werden müssen ist das menschlich und davor schützt dich kaum ein Tool ;-)

Unit Tests testen eine Unit - und zwar total isoliert. Und der Intergationstest baut ein Gesamtsystem zusammen und testet es. Soweit die Theorie / der Idealfall.

Bei etwas grösseren Systemen braucht es Zwischenschritte.

Unit Tests habe ich vor allem für Libraries und Baseunits, die wenig bis gar keine Abhängigkeiten von anderen Units haben, gemacht. Von denen habe ich nicht unbedingt Mocks erstellt, weil die ja gestet waren.

Einerseits habe ich von Tests generierte Ausgangsdaten als Eingangsdaten für Folgetests verwendet, was genau genommen kein Unit Test mehr ist (Wenn ein Fehler auftritt stellt sich die Frage ob es an den Daten oder am Programm liegt!) , und andererseits habe ich die UUT gleich mit den "echten getesteten units und den Mocks der noch ungetesteten units zusammengelinkt und einen Miniintegrationstest gemacht.
 

fastjack

Top Contributor
Wie würdet Ihr jetzt in diesem Beispiel vorgehen? Unittests schreiben mit Mocks und zusätzlich einen Integrationstest, oder nur einen Test ohne Mocks?
 
M

maki

Gast
Wie gesagt, Unittests mit Mocks und dann nochmal Integrationstests.

Nebenbei, das erzeugen von mockobjekten/Dummydaten etc. lagert man am besten in eine eigene Utilityklasse aus, sonst führen irgendwann minimale Änderungen am Prod. Code zu sehr vielen Änderungen am Testcode, das übliche DRY etc.
 

Andi_CH

Top Contributor
Details musst du logischerweise selbst entscheiden, aber mach es so wie ich oben beschrieben haben.

Unit test mit Mocks der Basis Units ohne Abhängigkeiten

Und die kritischen zwei Unit die gut miteinander auskommen sollten:
Die zweite von denen Mocken und die erste Testen - mit dem Mock von 1 und wenn nötig mit den echten Base units.

Dann die zweite mit der ersten und den Base units testen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
W Checkliste Unit Test Allgemeine Java-Themen 17
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
B Frage zu Unit-Tests Allgemeine Java-Themen 6
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
looparda Unit Test - Abgänigkeit zur Datenbank isolieren Allgemeine Java-Themen 3
R Unit Test Allgemeine Java-Themen 1
M Für was schreibt man Unit-Tests? Allgemeine Java-Themen 55
P J-Unit vergleich von 2 Objekten merkwürdig Allgemeine Java-Themen 7
G ThreadLocal in Muster "Unit of Work" Allgemeine Java-Themen 7
K Unit Test consolen ein-/ausgaben. Allgemeine Java-Themen 7
M Html Unit Whitespace-Problem Allgemeine Java-Themen 4
Jay_030 Guice: Frage im Umgang mit Unit-Tests Allgemeine Java-Themen 4
S Unit Testing mit JMock Allgemeine Java-Themen 11
alexpetri unit tests für pdfs Allgemeine Java-Themen 4
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
tfa Unit-Tests für private Methoden Allgemeine Java-Themen 25
W Unit Tests im "Hauptprojekt" oder in Modulen Allgemeine Java-Themen 3
M Eine Frage über Unit-Tests mit Java Allgemeine Java-Themen 2
N Ausgaben (System.out) umlenken und in Unit-Tests überprüfen? Allgemeine Java-Themen 2
Zrebna Zuverlässiges Automatisiertes Testen im eigenem Software-Unternehmen aufsetzen - How to? Allgemeine Java-Themen 12
Zrebna Automatisiertes Testen von größeren und komplexen Prozessen Allgemeine Java-Themen 56
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
Z Testen ob neuer Tag beginnt Allgemeine Java-Themen 37
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
B Eclipse WebSocket programmiert, kann es leider nicht testen. Allgemeine Java-Themen 15
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
perlenfischer1984 TestNG - Enum testen Allgemeine Java-Themen 1
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
F Testen von Methoden Allgemeine Java-Themen 3
B JUnit Zufalls Operation testen Allgemeine Java-Themen 1
P Testen von UIs Allgemeine Java-Themen 2
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
M Testen von verschiedenen Produktversionen Allgemeine Java-Themen 3
T EventBus testen Allgemeine Java-Themen 1
L JUnit - automatisiertes vs. manuelles Testen? Allgemeine Java-Themen 6
R Java Performance testen Allgemeine Java-Themen 18
B Mails testen Allgemeine Java-Themen 7
A AVL-Baum - Testen ob einer vorliegt Allgemeine Java-Themen 4
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
X Testen ob ein array leer ist Allgemeine Java-Themen 6
M Server-Responds testen, Code-Redundanz Allgemeine Java-Themen 3
H Thread Safety und Deadlocks testen Allgemeine Java-Themen 6
D Muss eine JNI Biblio testen (MAC OS X) Allgemeine Java-Themen 4
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
aokai Testen von Klassen die abhängig von Stdlibs URL sind Allgemeine Java-Themen 3
S Testen einer Anwendung durch klicken von Koordinaten Allgemeine Java-Themen 7
R Testen von Applets - versch. Browser und Java Versionen? Allgemeine Java-Themen 4
V Quellcode auf "Güte" testen? Allgemeine Java-Themen 5
G JAR-DAtei testen Allgemeine Java-Themen 15
J Klasse auf Konstruktor oder Methode testen? Allgemeine Java-Themen 3
A Junit Exceptions testen Allgemeine Java-Themen 3
Z Testen welches BS benutzt wird Allgemeine Java-Themen 3
G Testen von RMI,TCP/IP, Servlets etc. Allgemeine Java-Themen 2
M Welches Linux zum Java testen? Allgemeine Java-Themen 5
P Testen mit JUnit Allgemeine Java-Themen 8
L Java6 update N bekommt neues Browser-Plugin, bitte testen. Allgemeine Java-Themen 7
G testen mit JUnit? Allgemeine Java-Themen 3
K Testen ob Methode existiert? Allgemeine Java-Themen 2
N Cashbook Management Testen Allgemeine Java-Themen 7
A testen ob Primzahl dauert bei größeren zahlen extrem lange Allgemeine Java-Themen 8
M String testen? Allgemeine Java-Themen 2
M String testen? Allgemeine Java-Themen 6
N auf typ testen? Allgemeine Java-Themen 3
M Programmierstill: Bitte testen anhand HTML-Tool Allgemeine Java-Themen 18
K Testen einer Klasse mit File Objekt als Parameter Allgemeine Java-Themen 6
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
T GUI Testen Allgemeine Java-Themen 4
T GUI Testen Allgemeine Java-Themen 5
G Programm zum Testen der Striktheit von Java Allgemeine Java-Themen 9
H Laufwerk testen? Allgemeine Java-Themen 12
F Hilfe: Adjazenzmatrix mittels JUnit testen. Allgemeine Java-Themen 2
M Jemannd mit 1.4/1.3/1.2 zum Testen gesucht. Allgemeine Java-Themen 15
flashfactor Testen ob ein R/3 erreichbar bzw. noch am leben ist. Allgemeine Java-Themen 2
T Datum testen und Einsetzten Allgemeine Java-Themen 5
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
P Dateinamen mit regulärem Ausdruck testen Allgemeine Java-Themen 9
P Dateinamen testen? Schreibrechte auf Verzeichnis testen? Allgemeine Java-Themen 8
M Junit und Mocks Allgemeine Java-Themen 5
M Junit und Mocks bei JDBC Daos Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben