Erste Schritte Testklasse Binärbaum

Hallo,
ich habe eine Klasse "Binärbaum" erstellt und möchte diese nun mittels JUnit 5 testen. Leider schlägt mein Test schon fehl, wenn ich lediglich die Methode get.Right (oder get.Left) teste. Ich bin mir sicher, dass die Methode get.Right richtig ist, da wir diese in den Vorlesung vorgegeben bekommen haben. Daher vermute ich, dass ich den Test falsch implementiere. Ich möchte verifizieren, dass c das rechte Kind von b ist.

So sieht meine Testklasse aus:
Java:
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;

import org.junit.jupiter.api.Test ;

public class IntBinTreeTest {
   
@Test

void test1() {
   

IntBinTree e = new IntBinTree(5);
IntBinTree d = new IntBinTree(4);
IntBinTree c = new IntBinTree(e,3,d);
IntBinTree a = new IntBinTree(1);
IntBinTree b = new IntBinTree(a,2,c);

assertEquals(c, b.getRight());
}
}

Dies ist meine Klasse des Binärsbaums:
Java:
public class IntBinTree {
    private IntNode root;

    public IntBinTree() {
        this.root = null;
    }
   
    public IntBinTree(Integer content) {
        this.root = new IntNode(content);
    }
   
    public IntBinTree(IntBinTree left, Integer content, IntBinTree right) {
        this.root = new IntNode(content);
        if (left != null) {
            this.root.setLeft(left.root);   
        }
        if (right != null) {
            this.root.setRight(right.root);
        }
    }
   
    private IntBinTree(IntNode root) {
        this.root = root;
    }
   
    public boolean isEmpty() {
        return this.root == null;
    }
   
    public Integer getValue() {
        if(this.isEmpty()) {
            return null;
        }
        return this.root.getContent();
    }
   
    public IntBinTree getLeft() {
        if(this.isEmpty()) {
            return null;
        }
        return new IntBinTree(this.root.getLeft());
    }
   
    public void setLeft(IntBinTree tree) {
        if(this.isEmpty()) {
            return;
        }
        this.root.setLeft(tree.root);
    }
   
    public IntBinTree getRight() {
        if(this.isEmpty()) {
            return null;
        }
        return new IntBinTree(this.root.getRight());
    }
   
    public void setRight(IntBinTree tree) {
        if(this.isEmpty()) {
            return;
        }
        this.root.setRight(tree.root);
    }

Vielen Dank für jede Hilfe.
 

httpdigest

Top Contributor
Die Modellierung deines Baumens ist etwas merkwürdig. Du hast eine komische Dualität zwischen IntNode und IntBinaryTree, die dir an vielen Stellen Dinge kompliziert macht. Z.B. liefern deine Getter-Methoden immer ein IntBinTree, aber der linke/rechte Teil deines Baumes ist ja kein IntBinTree, sondern eben ein IntNode. Das zwingt dich, eben einen neuen, künstlichen/temporären IntBinTree im Getter zu erzeugen (Getter sollten niemals ein neues Objekt erzeugen!), der den IntNode des linken/rechten Teilbaumes kapselt. Und das wiederum lässt deinen Test fehlschlagen, denn der neue IntBinTree ist eben nicht der, den du früher erzeugt hast.
Warum ist ein Binärbaum denn nicht auch gleichzeitig ein Knoten?
 

flopalko

Bekanntes Mitglied
Die Modellierung deines Baumens ist etwas merkwürdig. Du hast eine komische Dualität zwischen IntNode und IntBinaryTree, die dir an vielen Stellen Dinge kompliziert macht. Z.B. liefern deine Getter-Methoden immer ein IntBinTree, aber der linke/rechte Teil deines Baumes ist ja kein IntBinTree, sondern eben ein IntNode. Das zwingt dich, eben einen neuen, künstlichen/temporären IntBinTree im Getter zu erzeugen (Getter sollten niemals ein neues Objekt erzeugen!), der den IntNode des linken/rechten Teilbaumes kapselt. Und das wiederum lässt deinen Test fehlschlagen, denn der neue IntBinTree ist eben nicht der, den du früher erzeugt hast.
Warum ist ein Binärbaum denn nicht auch gleichzeitig ein Knoten?
Daher meinte ich, dass eine Antwort ohne die Klasse IntNode schwierig wird. Wir wissen nicht wie in IntNode getRight implementiert ist.
Ich finde das Modell auch mehr als merkwürdig. Normalerweise hat man eine Node Klasse, mit allen Baummethoden implementiert und eine Klasse Tree, die dann einen Node (root) verwaltet.
 

httpdigest

Top Contributor
Es ist irrelevant, zu wissen, wie IntNode aussieht. Er ruft ja niemals eine Methode auf einem IntNode auf. getLeft/Right kommen aus IntBinTree. Bzw. die Ursache für das Fehlschlagen des Tests hat nichts mit IntNode.getLeft/Right zu tun.
 

flopalko

Bekanntes Mitglied
Das stimmt nicht. getRight ruft this.root.getRight auf. Da root ein IntNode ist wird diese Methode aufgerufen.
Bezüglich Fehlschlagen des Tests: das kann damit zu tun haben. Wenn IntNode.right wieder ein Baum ist, dann wird wieder die Methode vom Baum aufgerufen und dann ist klar weshalb der Test fehlschlägt.
 

httpdigest

Top Contributor
Hat aber trotzdem nichts mit dem Fehlschlagen seines Tests zu tun. Oder anders formuliert: Es gibt keine mögliche Implementierung von IntNode.getLeft/Right, die den Test grün werden lassen würde.
Das Problem sind die unterschiedlichen Objektidentitäten von IntBinTree. Die erste Identität ist die, die er im Test selbst erzeugt. Die nächste ist die, die er in IntBinTree.getLeft/Right erzeugt. Und diese werden getestet/verglichen. Hat absolut nichts mit IntNode zu tun.
 
Ups, natürlich. Hier ist int node:
Java:
public class IntNode {
    private Integer content;
    private IntNode left, right;

    public IntNode(Integer c) {
        content = c;
        left = null;
        right = null;
    }

    public Integer getContent() {
        return content;
    }

    public void setContent(Integer content) {
        this.content = content;
    }

    public IntNode getLeft() {
        return left;
    }

    public void setLeft(IntNode left) {
        this.left = left;
    }

    public IntNode getRight() {
        return right;
    }

    public void setRight(IntNode right) {
        this.right = right;
    }
   
}

Dass die Implementierung ungewöhnlich ist, ist mir auch schon aufgefallen als ich mich im Web ein wenig umgesehen hab. Nur ist das wie gesagt die Implementierung von meinem Prof, die ich übernehmen muss.
Aber dass der JUnit-Test fehlschlägt, weil es sich eben nicht um dasselbe Objekt handelt, sondern ein neues erzeugt wird, macht schon Sinn. Danke für eure Mühe.
 

flopalko

Bekanntes Mitglied
Natürlich gibt es diese Implementierung. Wenn getRight von IntNode den content von right liefert, dann wird ein neuer Tree mit diesem content erzeugt.
Angenommen er hat eine equals Methode für IntBinTree geschrieben, die ein Objekt gleich sein lässt wenn der content gleich ist, dann funktioniert der Test.

EDIT: siehe IntNode Klasse: es wird tatsächlich ein Node zürückgegeben, ein neuer Tree erzeugt und returned. Wenn die Tree Klasse nun die equals Methode wie erwähnt überschreibt, dann funktioniert der Test. Ist allerdings keine gute Modellierung.
 

httpdigest

Top Contributor
Angenommen er hat eine equals Methode für IntBinTree geschrieben, die ein Objekt gleich sein lässt wenn der content gleich ist, dann funktioniert der Test.
Angenommen, das wäre so (was es nicht ist), dann hast du Recht. Meine Beobachtung und Aussage bezog sich auf die veröffentlichten Informationen von IntBinTree, wo das eben nicht gegeben war. Und somit wäre es dann egal, was IntNode.getLeft/Right macht.
 

flopalko

Bekanntes Mitglied
Angenommen, das wäre so (was es nicht ist), dann hast du Recht. Meine Beobachtung und Aussage bezog sich auf die veröffentlichten Informationen von IntBinTree, wo das eben nicht gegeben war. Und somit wäre es dann egal, was IntNode.getLeft/Right macht.
Das ist richtig. Allerdings war nicht klar, ob es in IntBinTree noch weitere Methoden gibt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Java Testklasse Java Basics - Anfänger-Themen 5
A Exception vs. Testklasse (Programm testen) Java Basics - Anfänger-Themen 2
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
T Testklasse interaktiv Java Basics - Anfänger-Themen 3
M In Testklasse einem Array Werte übergeben Java Basics - Anfänger-Themen 6
S Testklasse und Ausgabe Java Basics - Anfänger-Themen 9
C Testklasse schreiben....! Java Basics - Anfänger-Themen 36
B Bubblesort-Algorithmus und Testklasse Java Basics - Anfänger-Themen 5
J Objekt-Array-Testklasse Java Basics - Anfänger-Themen 5
D Objektvariablen in Testklasse ausgeben Java Basics - Anfänger-Themen 6
W Fehler bei Ausführung von Testklasse Java Basics - Anfänger-Themen 2
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
A Größten Eintrag aus Binärbaum löschen Java Basics - Anfänger-Themen 4
L Ganzen BinärBaum ausgeben? Java Basics - Anfänger-Themen 3
L Binärbaum (Stammbaum) Java Basics - Anfänger-Themen 8
S Binärbaum in PreOrder in ArrayList speichern Java Basics - Anfänger-Themen 0
J Methoden Binärbaum, Traversierung in Array speichern Java Basics - Anfänger-Themen 18
K BinärBaum Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
C Binärbaum mit grafischer Ausgabe Java Basics - Anfänger-Themen 0
J Binärbaum formatiert ausgeben. Java Basics - Anfänger-Themen 7
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
M Binärbaum mit parent-Zeigern Java Basics - Anfänger-Themen 1
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
D Binärbaum Suche Java Basics - Anfänger-Themen 5
D Binärbaum probleme Java Basics - Anfänger-Themen 4
P Binärbaum - Primärschlüssel Java Basics - Anfänger-Themen 3
X Fehler Binärbaum Java Basics - Anfänger-Themen 6
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
P Binärbaum Ordnungsproblem Java Basics - Anfänger-Themen 8
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
P einen binärbaum implementieren Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B Binärbaum höhe herausfinden Java Basics - Anfänger-Themen 12
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
S Klassen Aufgabe: Binärbaum überprüfen Java Basics - Anfänger-Themen 16
S Binärbaum Java Basics - Anfänger-Themen 9
S Variable Parameterliste in Binärbaum Java Basics - Anfänger-Themen 2
N BinärBaum Hilfestellung Java Basics - Anfänger-Themen 8
S Binärbaum prüfen, ob sortiert oder unsortiert Java Basics - Anfänger-Themen 6
W Binärbaum zahlen addieren Java Basics - Anfänger-Themen 7
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
S Binärbaum Java Basics - Anfänger-Themen 7
I Binärbaum Java Basics - Anfänger-Themen 5
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
J Binärbaum getSize Java Basics - Anfänger-Themen 4
P Fragen zum Binärbaum Java Basics - Anfänger-Themen 3
S Binärbaum implementieren Java Basics - Anfänger-Themen 6
K Tiefe im Binärbaum Java Basics - Anfänger-Themen 2
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Binärbaum und Wrapperklassen Java Basics - Anfänger-Themen 6
F Binärbaum codieren. Codeproblem! Java Basics - Anfänger-Themen 4
D rekursion im binärbaum Java Basics - Anfänger-Themen 11
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
B Binärbaum auf Vollständigkeit prüfen Java Basics - Anfänger-Themen 15
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben