JUnit Tests

Wayne139

Aktives Mitglied
Hallo ich soll im folgenden Code1 die Methoden einwerfen leeren und getInhaltInEuro testen.
Ich habe auch schon einen JUnit Example Code2.
Meine Frage, wie bekomme ich den Test im Code2 richtig hin?


Code1:
Java:
public class Sparschwein {
    public int inhalt;

    public Sparschwein(int inhalt) {
        this.inhalt=inhalt;
    }

    public void einwerfen(int menge) {
        if (menge < 0) {
            throw new IllegalArgumentException("Betrag darf nicht negativ sein!");
        }
        this.inhalt += menge;
    }

    public int leeren() {
        int ersparnisse = this.inhalt;
        this.inhalt = 0;
        return ersparnisse;
    }

    public int getInhalt() {
        return this.inhalt;
    }

    public int getInhaltInEuro() {
        return this.inhalt / 10;
    }
}

Code2:
Java:
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class SparschweinTest {
    
    private Sparschwein s;

    @BeforeEach
    void setUp() {
        s = new Sparschwein(500);
    }
    
    @AfterEach
    void tearDown() {
        s.leeren();
    }
    
    @Test
    void testEinwerfen() {
        assertTrue(menge<0);
    }

    @Test
    void testLeeren() {
        assertTrue(s.inhalt==0);
    }

    @Test
    void testGetInhaltinEuro() {
        assertEquals(s.inhalt/10,s.inhalt);
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Deine bisherigen Tests kannst du ruhig erstmal löschen – sie die sind aktuell alles andere als sinnvoll.

Kennst du schon irgendwelche Methoden um Testfälle zu finden, zB Äquivalenzklassen?
Ansonsten kannst du dir zB Tabellen anlegen mit:
* welche Zustände kann das Sparschwein haben
* welche Aktionen kann man dann ausführen
* welches Ergebnis haben die zur Folge/wie ist der Zustand danach

Daraus kannst du dann Testfälle ableiten, das implementieren derer ist dann nur noch Fleißarbeit :)
 

mihe7

Top Contributor
@Wayne139 Du machst einen typischen Fehler, indem Du Tests für Methoden schreibst (evtl. hast Du Dir die auch noch von der IDE generieren lassen?) und nicht für die Funktionalitäten, die das Objekt bietet.

Wenn Du mal ein echtes Sparschwein nimmst, dann hat das Teil genau eine Aufgabe, nämlich als Geldspeicher zu dienen. Das, was ich hineinstecke soll hinterher auch wieder rauskommen und nicht Füße bekommen. Das lässt sich testen: ich nehme ein Sparschwein, dessen Inhalt x mir bekannt ist und werfe den Betrag b ein. Wenn ich das Teil hinterher ausleere, dann will ich x+b rausbekommen. Das wäre der Test einer einfachen Einzahlung eines Geldbetrags.

Java:
@Test
public void einfacheEinzahlungSollGesammeltWerden() {
    Sparschwein s = new Sparschwein(100);
    s.einwerfen(50);
    int erwarteterInhalt = 150;
    int entleerterInhalt = s.leeren();
    assertEquals(erwarteterInhalt, entleerterInhalt);
}

Im Gegensatz zur Realität gibt es beim Java-Sparschwein Schweinereien wie negative Beträge. Die sollen natürlich nicht erlaubt sein und wir erwarten eine Ausnahme, konkret eine IllegalArgumentException, wenn wir versuchen, einen negativen Betrag einzuzahlen... Hinterher muss der Betrag des Sparschweins unverändert sein.
Java:
@Test
public void negativeEinzahlungSollVerhindertWerden() {
    Sparschwein s = new Sparschwein(150);
    assertThrows(IllegalArgumentException.class, () -> s.einwerfen(-50));
    int erwarteterInhalt = 150;
    int gemeldeterInhalt = s.getInhalt();
    assertEquals(erwarteterInhalt, gemeldeterInhalt);
}

(Als Wink mit dem Zaunpfahl habe ich hier ganz bewusst einmal den entleerten und einmal den gemeldeten Inhalt verwendet...)

Wie Du siehst, sind von einem Test mehrere Methoden betroffen. Hier heißt es ein wenig aufpassen. Die Tests testen die Einzahlung. Als Nebeneffekt wird dabei auch das Leeren zum Teil getestet. Es macht also keinen Sinn einen weiteren Test zu schreiben, der genau das gleiche abdeckt wie die bereits vorhandenen: leeren() liefert das, was im Sparschwein ist. Allerdings ist damit das Leeren noch nicht vollständig getestet, so dass diesbezüglich noch andere Tests notwendig werden (welche, kannst Du Dir mal überlegen).

Wenn Du das vergleichst, ist das ein Ergebnis dessen, was @mrBrown geschrieben hat. Es kann ein Betrag von x mit 0 <= x <= Integer.MAX_VALUE eingezahlt werden. Die Tests decken nun Fälle im Bereich x < 0 und x >= 0 ab. In der Regel ist es sinnvoll, auch an den Grenzen zu testen, d. h. bei x == 0 und bei x == Integer.MAX_VALUE.

AktionFallAusgangssituationerwartetes Ergebnis
Einzahlung(x)x < 0Sparschwein mit Inhalt y- IllegalArgumentException
- Sparschwein hat Inhalt y
Einzahlung(x)x > 0 && x+100 < 2^32Sparschwein mit Inhalt y- Sparschwein hat Inhalt y+x
Einzahlung(x)x > 0 && x+100 >= 2^32Sparschwein mit Inhalt y
TBD​
Einzahlung(x)x == 0Sparschwein mit Inhalt y- Sparschwein hat Inhalt y
............
 

MoxxiManagarm

Top Contributor
Meine Frage, wie bekomme ich den Test im Code2 richtig hin?

1. Die Testfälle überlegen, das @mrBrown und @mihe7 schon super ausgeführt.
2. Bei der Implementierung der UnitTest hast du immer mindestens 3 Schritte:
- Vorbereitung, möglicherweise "ausgelagert" in beforeEach
- Durchführung, das ist immer der eigentliche Methodenaufruf, also i.d.R. eine Zeile
- Vergleich, das sind die asserts

Nehmen wir nun also als Beispiel das einfache Einwerfen. Folgende Ausgangslage aus deinem Code.

Java:
class SparschweinTest {
    private Sparschwein s;

    @BeforeEach
    void setUp() {
        s = new Sparschwein(500);
    }
  
    @Test
    void testEinwerfen() {
        // ...
    }
}

Deine Vorbereitung ist hier schon gemacht, die Ausgangslage (siehe auch @mihe7 Tabelle) ist das Sparschwein mit dem Inhalt y = 500. Diese Ausgangslage stellst du mit dem BeforeEach für alle Testfälle her. Theoretisch könntest du das aber auch im Testfall selbst machen.

Nun führst du die Einzahlung durch, dafür kannst du dir einen Wert ausdenken. z.B. 100.
Java:
s.einwerfen(100);

Du erwartest nun, dass der Inhalt 600 entspricht, was du nun abgleichst.
Java:
assertEquals(s.getInhalt(), 600);


Das Beispiel betrifft jetzt den Gutfall, du hast aber normalerweise noch andere Fälle, wodurch sich sprechendere Namen anbieten, nicht nur testEinwerfen. Das Beispiel hier kannst du einfach ergänzen zu testEinzahlenSuccess (o.Ä.).


Insgesamt sieht das dann in etwa so aus:
Java:
class SparschweinTest {
    private Sparschwein s;

    @BeforeEach
    void setUp() {
        s = new Sparschwein(500);
    }
  
    @Test
    void testEinwerfenSuccess() {
        s.einwerfen(100);
       assertEquals(s.getInhalt(), 600);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
6 Best Practice Feedback zu Service / JUnit Tests Java Basics - Anfänger-Themen 3
M Anfängerfehler - Tests JUnit IntelliJ Java Basics - Anfänger-Themen 24
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
L JUnit tests in java Java Basics - Anfänger-Themen 5
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
T Junit Tests Java Basics - Anfänger-Themen 7
M Junit tests gehen nicht Java Basics - Anfänger-Themen 2
F Gleiche JUnit-Tests automatisert mit verschiedenen Methoden ausführen Java Basics - Anfänger-Themen 6
J Einführung in JUnit-Tests Java Basics - Anfänger-Themen 5
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
D Cannot find JUnit.framework Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
U JUnit testen auf SomeException Java Basics - Anfänger-Themen 5
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
A JUnit testing is inkonsistent Java Basics - Anfänger-Themen 12
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
F JUnit - Was ist mit "side effects" gemeint ? Java Basics - Anfänger-Themen 2
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
L Junit Testing bei XML? Java Basics - Anfänger-Themen 3
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
O JUnit - Objektreferenzen Java Basics - Anfänger-Themen 3
G Testen mit JUnit Java Basics - Anfänger-Themen 4
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
S Junit Test Java Basics - Anfänger-Themen 2
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
A IllegalArgumentException in JUnit testen Java Basics - Anfänger-Themen 3
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
V JUnit Klassen Java Basics - Anfänger-Themen 3
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
K JUnit: Objekte von eigenen Klassen vergleichen...geht nicht Java Basics - Anfänger-Themen 5
Z JUnit Exception Java Basics - Anfänger-Themen 2
M Ist die Hamcrest Bibliothek auch schon in Junit 4.11 verfügbar? Java Basics - Anfänger-Themen 1
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7
T JUnit test failed Java Basics - Anfänger-Themen 3
T Junit in Eclipse Java Basics - Anfänger-Themen 1
P JUnit bedeutungen Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
S JUnit assertEquals funktioniert nichgt wie es sollte :( Java Basics - Anfänger-Themen 7
B JUnit für JFileChooser Java Basics - Anfänger-Themen 6
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
S File vergleich - Junit Java Basics - Anfänger-Themen 6
T JUnit Java Basics - Anfänger-Themen 18
G Junit Java Basics - Anfänger-Themen 4
X JUnit testing Java Basics - Anfänger-Themen 7
T JUnit Suite frage Java Basics - Anfänger-Themen 6
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
S InvocationTargetException bei JUnit Testlauf Java Basics - Anfänger-Themen 2
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
T Junit --Exception testen Java Basics - Anfänger-Themen 15
G Erste Schritte JUNIT Regressionstests automatisieren Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
M JUnit - nur Failures loggen? Java Basics - Anfänger-Themen 2
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
R String Replace für JUnit Java Basics - Anfänger-Themen 19
T JUNIT Nullpointerexception Java Basics - Anfänger-Themen 3
S [JUnit] eigener Testsuite Runner + Ausgabe Java Basics - Anfänger-Themen 6
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
W Mit jUnit Array testen? Java Basics - Anfänger-Themen 5
I JUnit Datapoints für mehrere Testklassen Java Basics - Anfänger-Themen 4
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
L JUNIT Testing Java Basics - Anfänger-Themen 3
C jUnit: Erfahren, ob der getestete Code eine Exception gehandelt hat Java Basics - Anfänger-Themen 3
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben