Verständnisproblem beim Mocking

Saheeda

Top Contributor
Hallo,

ich habe n Problem dabei zu verstehen, warum man mockt / welchen Sinn das Ganze hat.
Bisher habe ich zwei Arten von Tests dazu gesehen:

a) Prüfe, ob Funktion X überhaupt (oder nie, oder x-mal) aufgerufen wird und durchläuft.
b) Nimm an, dass die Funktion den Wert Z zurückliefert und prüfe, ob das auch so ist.

zu a) Welche Aussagekraft hat ein Test, der nur überprüft, ob eine Funktion überhaupt aufgerufen wird und sich nicht um die Auswirkung kümmert bzw die Funktion nichts Validierbares macht?
Ich kann prüfen, ob keine Exception fliegt, ja. Aber dass es nicht knallt, bedeutet ja noch lange nicht, dass alles so funktioniert, wie es soll.

zu b) Welchen Sinn hat es, ein Testergebnis zu überprüfen, das ich bereits vorher festlege?


Bisher sieht Mocking für mich so aus:
- Male das Haus rot an.
- Überprüfe, ob das Haus rot ist.
- Freu dich nen Keks, dass das Haus rot ist.
 

Lodoss

Aktives Mitglied
Mock-Objekte (auch Attrappe, von englisch to mock ‚etwas vortäuschen‘) sind in der Softwareentwicklung Objekte, die als Platzhalter für echte Objekte innerhalb von Modultests verwendet werden.

die eigentliche Idee dahinter ist, das du einen Test schreibst, der Festlegt wie sich dein richtiges Objekt später verhalten soll.
Danach kannst du dein eigentliches Objekt erstellen und auf deinen Test loslassen und schauen, ob das Objekt die Testkriterien erfüllt oder nicht.

Siehe auch Testgetriebene Entwicklung

edit::

Mock-Objekte können im übrigen auch Externe Quellen sein die du z.B. in einem Unit-Test nicht abbilden kannst da diese garnicht zur verfügung stehen

Objekt A kann seine Daten aus einer Datenbank laden und hat eine Methode "setDatenbank()"
Damit das Objekt im test jetzt nicht für jede Funktion "hey ich hab keine DB" rausgibt erzeugst du ein Mock-Objekt das so tut als wäre es die Datenbank und für die jeweiligen Funktionen Testwerte rausgibt
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
TDD ist mir klar.

Aber wenn ich zum Beispiel eine Methode doSomething() habe und nur überprüfe, ob keine Exception fliegt, dann kann in der Methode selbst auch zehntausend Mal "Du bist doof" stehen und der Test ist trotzdem grün.
 

Lodoss

Aktives Mitglied
du kannst ja auch mehr als nur prüfen ob "doSomething()" keine exception wirft. welchen rückgabetyp hat das ding, wie reagiert es auf sonderfälle (z.B. divide(double i, double j) mit divide(10d, 0d) aufrufen) usw usw.

und um zu deiner ursprünglichen Frage zurückzukommen:

ich rufe eine Funktion auf mit der signatur "int add(Integer val, Integer val2)" und diese ist wie folgt implementiert:
Java:
Integer add(val 1, val2)
{
    if (val1 == null) { return val2; }
    return val1+val2;
}
und dein nutzender code sieht wie folgt aus:

Java:
Integer val1 = null;
Integer val2 = 20;

Integer result = add(val1, val2);

jetzt kommt aber ein anderer developer an und ändert den code von "add(...) wie folgt:

Java:
Integer add(val 1, val2)
{
    if (val1 == null) throw new IllegalArgumentException("val 1 is null");
    return val1+val2;
}

dann bekommst du das nicht direkt mit, sondern erst wenn dein programm mit der iae gecrashed ist.
Der Unit-test der das ding prüft hätte aber (sofern er den fall abgedeckt hat) alarm geschlagen und du hättest reagieren können

edit:::

unit-tests bringen dir erst wirklich etwas, wenn du eine gewisse menge an code (10MB+) hast, und/oder in einem Team arbeitest.
Stell dir vor, du hast eine methode (die sehr komplex ist) und du hast etwa 5000 aufrufer. nun stellst du fest "mist, da ist ein bug drin in einem ganz speziellen sonderfall" dann passiert meistens folgendes:

"wenn ich das jetzt änder, mach ich möglicherweise 5000 stellen unbrauchbar"
"dann bau ich mir lieber nen workaround"

und nach gut 2 monaten besteht der code zu 30% workarounds

mit unit-tests wäre das so gelaufen:

"hmm, wenn ich das änder, mache ich möglicherweise 5000 stellen unbrauchbar"
"ändern wir das doch mal"
"hmmm, 3 unit-tests für funktion (2230, 2503 und 4612) schlagen fehl..."
"anpassungvon 2230, 2503 und 4612"

keine workarounds :)
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
@Lodoss

Warum/wie man Tests schreibst, ist mir klar.

Ich verstehe nur nicht, warum man bestimmte Klassen "faked" & welche Aussagekraft so ein Test dann noch hat.
 

ARadauer

Top Contributor
@Lodoss

Warum/wie man Tests schreibst, ist mir klar.

Ich verstehe nur nicht, warum man bestimmte Klassen "faked" & welche Aussagekraft so ein Test dann noch hat.

Warum man Klassen faked?
Ich habe eine Klasse die eine Rechnung erstellt. Dazu braucht sie Preise, Rabatte usw.. dazu benutzt sie andere Klassen. Die Rabatt Klasse benutzt wieder einen Kundengruppen Service, da die Rabatte von Kunden abhängig sind, diese Klassen greifen evtl auf andere Spring Services zu, die wieder mit JPA auf eine Datenbank zugreifen usw..
aber das interessiert mich alles gar nicht, ich will nur wissen, wenn ich 100 € und 50 € und 10 % Rabatt habe, dass ähmn ja 135 € raus kommt. Deshalb fake ich die klassen die meine Rechnungsklasse benutzt und definiere, die Werte dich ich testen will.

Ich arbeite in einem Projekt, bis du da für die konkrete Rechnungs Position den Steuersatz hast, werden mehr als 10 Klassen aufgerufen, die unter umständen komplexe Regel Engines aufrufen und Datenbank Zugriffe machen. Da muss man Dinge faken, sonst werden die Unit Tests zu komplex.
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
@Ardauer

Wenn ich dich richtig verstehe, prüfst du "nur":
Wenn ich von Klasse X korrekte Daten zurückbekomme, wie reagiert dann meine zu testende Klasse A?
bzw.: Wenn x nur Mist zurückliefert, reagiert A dann entsprechend?
 

Lodoss

Aktives Mitglied
Ich versuchs mal anders:

du hast eine Roboterdrohne, die soll von Paris nach München fliegen können
Die Drohne ist normalerweise GPS gesteuert und macht daran die eigene Position fest
Die Drohne ist so konzipiert, das diese landet, sobald das GPS Signal nicht empfangen werden kann.

Wenn du jetzt die software testen willst, ohne das du die Hardware zur hand hast, dann macht es sinn der Software die Hardware vorzugaukeln. Ob diese korrekte oder inkorrekte Daten rausgibt... ist beides Interesssant. Es geht halt darum Messbar zu machen, wie sich die Software unter bestimmten bedingungen Verhält ohne das man diese replizieren muss, denn wenn du deine Software jetzt nicht grade auf nem Handy testest sondern auf einer "normalen" workstation, hast du kein GPS signal / sensor.

Man stelle sich vor, das ding bekommt eine "Selbstzerstörung"... willst du die mit Hardware ausprobieren? :p
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Du fakst nicht die Klasse die du testen willst, sondern Klassen, mit denen die zu testende Klasse arbeitet (Beispiel Datenbank wurde ja schon gesagt).

Somit kannst du zum Beispiel auch Fehler testen, die unter normalen Umständen nicht auftreten würden (Datenbank meldet: Tabelle nicht gefunden).

Ich denke auch, das Mocking in kleinen Umgebungen nicht soviel Sinn macht. Das wird erst in größeren System interessant.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S iText PDF - Verständnisproblem beim Update von TableCells (Seitenzahlen) Allgemeine Java-Themen 2
S String Encoding Verständnisproblem Allgemeine Java-Themen 22
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
stroggi Bytecode LCMP - Verständnisproblem Allgemeine Java-Themen 3
H Listener Verständnisproblem Allgemeine Java-Themen 5
I Verständnisproblem mit nicht vorhandener Klasse Allgemeine Java-Themen 4
K OCJP Beispielfrage.. Verständnisproblem Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
B Stream Verständnisproblem Allgemeine Java-Themen 2
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
H Verständnisproblem mit Decimalseperator Allgemeine Java-Themen 2
G Verständnisproblem Allgemeine Java-Themen 11
A Verständnisproblem zur Hashtable Allgemeine Java-Themen 10
A Verständnisproblem Allgemeine Java-Themen 9
A Verständnisproblem mit GregorianCalendar Allgemeine Java-Themen 10
T Verständnisproblem Allgemeine Java-Themen 16
G Verständnisproblem double und float Allgemeine Java-Themen 7
R ResourceBundle-Verständnisproblem Allgemeine Java-Themen 3
M Class#getClassLoader - Verständnisproblem Allgemeine Java-Themen 3
M Verständnisproblem bei mehrdimensionalen Arrays Allgemeine Java-Themen 3
S verständnisproblem bei File Allgemeine Java-Themen 6
L Verständnisproblem ? Allgemeine Java-Themen 3
V Verständnisproblem Eclipse BuildPath <-> Import Jar Fi Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben