Fremde Typen mockt man nicht?

thecain

Top Contributor
Mich hat diese Aussage von @mrBrown gerade ein bisschen zum Nachdenken gebracht, aber wollte nicht den Thread verwüsten, in dem es stand.

außer den EntityManager, aber fremde Typen mockt man nicht

Ich hab bisher den EntityManager immer fröhlich gemockt. Meist so ähnlich: https://www.adam-bien.com/roller/abien/entry/mocking_jpa_entitymanager_with_query

Das hatte den Vorteil, dass ich keine H2 Datenbank starten musste und die Tests sehr schnell ausführbar waren. War ich hier immer daneben oder ist das mehr eine persönliche Präferenz?
 

mrBrown

Super-Moderator
Mitarbeiter
Von Mockito selbst: Don't mock a type you don't own.

Ich hab bisher den EntityManager immer fröhlich gemockt. Meist so ähnlich: https://www.adam-bien.com/roller/abien/entry/mocking_jpa_entitymanager_with_query

Das hatte den Vorteil, dass ich keine H2 Datenbank starten musste und die Tests sehr schnell ausführbar waren. War ich hier immer daneben oder ist das mehr eine persönliche Präferenz?
Entkoppelt Business-Code und Datenbank-spezifischen Code, zb mit Repository oder DAO-Pattern :)

Um mal bei dem Beispiel von Adam Bien zu bleiben: Der Test läuft auch erfolgreich durch, wenn die Query vollkommener Unsinn ist, zB einfach ein leerer String oder der EntityManager völlig falsch benutzt wird. Das muss also in jedem Fall zusätzlich gegen eine echte Datenbank getestet werden, ansonsten testen man den Großteil des Verhaltens gar nicht.

Einfach lösen kann man das, wenn man dann einfach Business-Logik und Datenbankzugriffe entkoppelt, zB indem man ein RegistrationsRepository einführt. Dieses kann man dann zum Testen der Business-Logik testen und zusätzlich selbst gegen eine echte Datenbank testen.
 

thecain

Top Contributor
Das muss also in jedem Fall zusätzlich gegen eine echte Datenbank getestet werden, ansonsten testen man den Großteil des Verhaltens gar nicht.
Ja, klar. Das wäre dann bei "mir" der Integration Test, der in einem TestContainer läuft.

Deine Argumentation ist auch stimmig für mich soweit. Ist wahrscheinlich auch ein bisschen ein Paradigma. Wir halten uns zum Beispiel Architekturtechnisch stark an Adam Bien, keine Ahnung warum, ist scho seit Jahren so. Er vertritt auch sehr stark die Meinung keine Layer einzubauen nur um der Abstraktion willen. Heisst, wenn der Service oder das Repository nur ein durchreichen auf den Entitymanager ist, kann auch direkt der EntityManager verwendet werden. Wenn man später den Layer braucht kann er immer noch hinzugefügt werden.

Meine ursprüngliche Frage hat sich aber geklärt und ich verstehe die Argumentation dahinter.
 

mrBrown

Super-Moderator
Mitarbeiter
Er vertritt auch sehr stark die Meinung keine Layer einzubauen nur um der Abstraktion willen.
Wenn man das konsequent durchzieht programmiert man in Maschinensprache, alles andere ist doch nur Abstraktion um der Abstraktion Willen ;) :p

Heisst, wenn der Service oder das Repository nur ein durchreichen auf den Entitymanager ist, kann auch direkt der EntityManager verwendet werden. Wenn man später den Layer braucht kann er immer noch hinzugefügt werden.
Ich würde sinnvolle Kapselung nicht nur als "Abstraktion um der Abstraktion Willen" bezeichnen, grad in Bezug auf Übersichtlichkeit und Testbarkeit gewinnt man einiges dazu, was dann auch bei nötigen Umbauten hilft.
Wenn man ein extra Repository einführt verliert man nichts, gewinnt aber saubere Trennung zwischen den einzelnen Teilen und macht das Testen sich noch eine ganze Ecke einfacher.

Grad das von dir genannte Beispiel ist sogar nur ein Durchreichen des Entitymanagers, wenn man das Prinzip ganz durchzieht müsste man auf die dort "getestete" Klasse verzichten und das direkt in die Resourcen-Klasse ziehen.


Ich finde Adam Bien durchaus in vielen Teilen gut, aber grad dieses Beispiel (mag dem Alter geschuldet sein) ist relativ schlecht und eher eine Sammlung von Antipatterns als ein gutes Beispiel 😅
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Fremde Programme öffnen? Allgemeine Java-Themen 16
B Fremde Packages benutzen? Allgemeine Java-Themen 11
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
M Generics / Typen Allgemeine Java-Themen 1
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
F Grundrechenarten mit eigenen Typen Allgemeine Java-Themen 9
N Vergleich von generischen Typen Allgemeine Java-Themen 2
S Überschriebene Methode eines generischen Typen aufrufen Allgemeine Java-Themen 4
K Arrays.asList und primitive Typen Allgemeine Java-Themen 2
H2SO3- problem mit objecten verschiener Typen (E, <E> und T) Allgemeine Java-Themen 2
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
T DataFrame (Matrix mit mit verschiedenen Typen pro Spalte) Allgemeine Java-Themen 4
H2SO3- merken versch. Date Typen + erlaubte und unerlaubte kombinat Allgemeine Java-Themen 4
V Variable vom Typ String zum Typen "Message" konve Allgemeine Java-Themen 2
F Kann man keine Arrays von generischen Typen erstellen? Allgemeine Java-Themen 2
Q Typen von Generics & Casten Allgemeine Java-Themen 3
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
lumo Typen MSSQL + JAVA Allgemeine Java-Themen 4
B Generische Typen instanzieren Allgemeine Java-Themen 11
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Methoden auf Arrays aller primitiver Typen zusammenfassen? Allgemeine Java-Themen 8
C Dynamisch Objekte unterschiedlicher Typen erzeugen Allgemeine Java-Themen 6
S Variablennamen von primitiven Typen eines Konstruktors lesen Allgemeine Java-Themen 7
J parsen von verschiedenen dokument typen Allgemeine Java-Themen 3
S generics primitiver typen Allgemeine Java-Themen 5
D generischer Iterator mit verschiedenen Typen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben