Frage bzgl. Testbarkeit von Methoden in Relation zu Ihren Abhängigkeiten

Maik.Neumann

Aktives Mitglied
Hallo zusammen !

Ich habe da mal eine Frage bzgl. der Testbarkeit von diversen selbstimplementierten Methoden in Java. Nun ist der folgende Anwendungsfall sehr leicht mittels JUnit (auch mit diversen Übergabeparametern) zu testen:

Java:
public class MeineKlasse{

     public void meineMethode(String vorname, String nachname, Date geburtsdatum){

          // do something

     }

}

Diese Methode bzw. deren Geschäftslogik basiert einzig und alleine darauf, dass eine bestimmte Parameterübergabe erfolgen muss. Ansonsten besitzt diese Methode keinerlei Abhängigkeiten nach außen (auch nicht innerhalb der Klasse, in der sie implementiert ist)

Aber wie gestaltet sich der Sachverhalt nun, wenn folgendes gegeben ist:

Java:
public class MeineKlasse{

     private MeineAndereKlasse andereKlasse = new MeineAndereKlasse();

     // some other java code here

     public void meineMethode(String vorname, String nachname, Date geburtsdatum){

          List<PersonenRepo> personenRepo = this.andereKlasse.getPersonenRepo;

          // do something mit personenRepo

     }

}

Hier existiert eine gewisse Abhängigkeit mit der member variablen "andereKlasse". Auf diese Referenzvariable wird innerhalb der Methode "meineMethode" zugegriffen und somit besteht eine gewisse Abhängigkeit zu der Klasse "MeineAndereKlasse " und dessen Existenz, sowie auch zu der Klasse "MeineKlasse" und deren Existenz. Wenn man so möchte, ist diese Methode nicht vollständig autonom.

Das bedeutet, diese beiden Klassen müssen innerhalb eines Junit Tests manuell von mir erzuegt werden, bevor ich einen JUnit Test für die Methode "meineMethode" überhaupt implementieren kann.

Nun stellt sich mir die Frage, wie ich dieses Problem sauber lösen könnte (auch in Hinblick darauf, dass andere Methoden, die ebenfalls mt JUnit getestet werden sollen, vielleicht noch mehrerer solcher Abhängigkeiten haben könnten.

Spontan würde mir der folgende Lösungsansatz einfallen, welcher allerdings die Anzahl der Übergabeparameter einer Methode sehr schnell erhöhen wird:

Java:
public class MeineKlasse{

     private MeineAndereKlasse andereKlasse = new MeineAndereKlasse();

     // some other java code here

     public void meineMethode(String vorname, String nachname, Date geburtsdatum, MeineAndereKlasse andere Klasse){

          List<PersonenRepo> personenRepo = andereKlasse.getPersonenRepo;

          // do something mit personenRepo

     }

}

Somit würde ich eine gewisse Autonomität und evtl. bessere Testbarkeit für die Methode "meineMethode" erreichen, denn ich müsste zumindest nicht in ein Objekt der Klasse "MeineKlasse" für meinen Jnit Test erzeugen.

Wie kann man generell mit einer solchen Art von Sourcecode umgeben? Wie könnte man ihn besser schreiben? Vor allem, wie könnte man in besser testbar schreiben?

Danke und Gruß
 
Zuletzt bearbeitet:

Phash

Top Contributor
du testest die Methode auf einem Objekt.
Das Objekt hat zur Konstruktionszeit schon das andere Objekt
mit
Java:
private MeineAndereKlasse andereKlasse = new MeineAndereKlasse();
instanziert.
Von daher ist das nicht null, und schon gesetzt.

Ich gehe an diese Dinge so heran, dass ich versuche, mehrere Tests zu machen:
ein Test, der versucht die realen Gegebenheiten nachzubauen (das heisst, die Methode wird so getestet, wie es vorgesehen ist)
Eine Methode sollte aber auch nur aufrufbar sein, wenn sie ausführbar ist.

heisst: wenn du eine Methode in einem Objekt hast, und dann dort Abhängigkeiten hast, dann muss die Methode prüfen, ob alles ok ist, sonst fliegt ja eh eine NPE
 

Maik.Neumann

Aktives Mitglied
Und wie wäre der Sachverhalt, wenn das Objekt der Klasse "MeineAndereKlasse" erst irgendwann später innerhlab der Klasse instanziiert wird (evtl. vielleicht sogar gar nicht im Konstruktor dieser Klasse selbst?:

Java:
  private MeineAndereKlasse andereKlasse;
 

Phash

Top Contributor
dann musst du die Schritte, die vorher notwendig sind, damit du diese Methode ausführen kannst, durchführen.

Das ist aber unsauber.

Evtl. macht es Sinn, die Sache nochmal zu überdenken, und das Design zu vereinfachen.
Die Methode, die diese Vorbedingungen benötigt, könnte in einer eigenen Klasse sein, die die fertigen Vorbedingungen übergeben bekommt.
 

Maik.Neumann

Aktives Mitglied
heisst: wenn du eine Methode in einem Objekt hast, und dann dort Abhängigkeiten hast, dann muss die Methode prüfen, ob alles ok ist, sonst fliegt ja eh eine NPE

Ok, aber wenn meine zu testende Methoden tatsächlich zwingend eine Instanz dieser Abhängigkeit braucht, dann nutzt es doch nichts auf null zu prüfen.

Java:
public void meineMethode(String vorname, String nachname, Date geburtsdatum){

     if(this.andereKlasse != null){
 
          List<PersonenRepo> personenRepo = this.andereKlasse.getPersonenRepo;

     }

     // Jetzt würde ja irgendwann auf personenRepo zugegriffen werden
 
      // do something mit personenRepo
 
}
Leider bist Du nciht auf meinen folgenden Vorschlag eingegangen (für die generell bessere Testbarkeit):

Java:
public void meineMethode(String vorname, String nachname, Date geburtsdatum, MeineAndereKlasse andere Klasse){
 
          List<PersonenRepo> personenRepo = andereKlasse.getPersonenRepo;
 
          // do something mit personenRepo
 
     }
 
Zuletzt bearbeitet:

Phash

Top Contributor
Brauchst du diese Abhängigkeit in deinem Objekt oder in deiner Methode?

Das ist designabhängig, und sollte nicht nur der Testbarkeit dienen.

Solltest du die Abhängigkeit in der Klasse brauchen, dann musst du sicherstellen, dass es da ist, wenn du es benutzt (null check, und dann eben nachfordern, oder bei der Methode übergeben, und prüfen was du machst (ist aber viel overhead))
Eigentlich ist der Konstruktor dafür der richtige Ort.
 

Phash

Top Contributor
warum hast du dann eine Membervariable für das Ding?
Das ist doch dann eindeutig unnötig, deine Frage damit obsolet.

Wenn du das nur in dieser einen Methode brauchst, und sonst NIE WIEDER, dann gehört es NICHT in die Klasse, sondern als Aufrufparameter an die Methode.
 

Maik.Neumann

Aktives Mitglied
Und wie wäre der Sachverhalt, wenn ich diese Abhängigkeit nicht nur in dieser einen Methden benötigen würde, sondern auch noch in zwei oder drei anderen Methjoden, die aber bereits jeweils 3 Übergabeparameter besitzen? Ich meine, da wäre es doch kein guter Stil für jede Methode jeweils noch einen zusätzlich Übergabeparameter zu definieren, der diese Abhängigkeit in die Methode hineingibt, oder?

Und hier ist eben die Frage, wie das sauber zu lösen wäre, möglich ohne die Klasse manuell instanziieren zu müssen, wo diese Abhängigkeit als Member Variable hinterlegt ist. Aber scheinbar funktioniert das nur so, oder?

Danke und Gruß
 

MR_UNIX

Bekanntes Mitglied
In solchen Fällen, wo die getestete Methode auf anderen Bestandteilen basiert, nutzt man sog. Mock Objects, also Objekte, deren Inhalt und Verhalt exakt definiert ist. Sprich wenn eine addiere() Methode der Klasse Taschenrechner genutzt wird, dann würde die Methode des Mock Objektes immer 2 zurückgeben, egal welche Parameter übergeben werden. Damit hält man die genutzte Rechenzeit beim Test gering und hat trotzdem alle Abhängigkeiten.
 

Maik.Neumann

Aktives Mitglied
Hallo noch einmal,

ich habe hier noch ein anderes Beispiel meiner angesprochenen Methode, dass etwas komplexer ist:

Java:
 public class MeineKlasse{
     
         private MeineAndereKlasse andereKlasse = new MeineAndereKlasse();
     
         // some other java code here
     
         public void meineMethode(String vorname, String nachname, Date geburtsdatum){
     
              TestObject mySpecificTestObject = this.andereKlasse.getFormModel().getTextClass().getTestObject();
     
              // Do something with mySpecificTestObject 
     
         }
     
    }

Hier wird ein anderes Objekt aus einer bestimmten Abhängigkeit benötigt. Wie kann man solche Fälle sinnvoller gestalten? Spricht ein solches Szenario schon für ein schlechtes und zu komplexes Design (z.B. Neid der Klassen untereinander)?

Danke und Gruß
 
Zuletzt bearbeitet:

MR_UNIX

Bekanntes Mitglied
Immer noch Mock Objects. Zum Thema Design: natürlich sollte man auf möglichst wenig Kopplung achten aber irgendwo gibt es immer Abhängigkeiten, denn wenn keine die andere Klasse kennt, dann wird ja kein komplettes Programm draus. Interfaces sind aber immer schön :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
D Frage bzgl. Interfaces Java Basics - Anfänger-Themen 10
K Frage bzgl. Multithreading Java Basics - Anfänger-Themen 5
M Frage bzgl. Oracle Java Zertifizierung Java Basics - Anfänger-Themen 4
1 Frage bzgl. Polymorphismus Java Basics - Anfänger-Themen 6
X Frage zur Vererbung (bzgl Supercontruktor) Java Basics - Anfänger-Themen 7
L Frage bzgl. Threads beim Bilder laden Java Basics - Anfänger-Themen 3
P Frage bzgl. Class Sharing Java Basics - Anfänger-Themen 2
G Dringende Frage bzgl. meines Codes Java Basics - Anfänger-Themen 30
C Frage bzgl. main Java Basics - Anfänger-Themen 2
C Frage bzgl. action von Button Java Basics - Anfänger-Themen 6
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben