Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests

PinkMuffin

Bekanntes Mitglied
Hallo,
wir müssen ein Programm schreiben, dass überprüft, ob ein Produkt in einem bestimmten Zeitrahmen gekauft wurde und dann den Bruttopreis mit der jeweiligen Steuer berechnen und mit einer Testklasse prüfen, ob alles stimmt. An sich funktioniert meine Klasse (manuell überprüft mit den gleichen Fällen der Testklasse), jedoch habe ich wohl das mit den Testklassen nicht ganz verstanden, die spuckt nämlich zu jeder Test-Methode einen Fehler aus (AssertionError: expected.. but was...), so sieht sie aus:
[CODE lang="java" title="Testklasse"]import static org.junit.Assert.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class ProduktTest
{

Produkt produktIstErmaessigt, produktNichtErmaessigt;
Calendar untereGrenze, obereGrenze, zuFrueh, zuSpaet, mittenDrin;
@BeforeClass
public static void setUpBeforeClass() throws Exception
{
}

@AfterClass
public static void tearDownAfterClass() throws Exception
{
}
@Before
public void setUp()
{
untereGrenze = new GregorianCalendar(2020,6,01);
obereGrenze = new GregorianCalendar(2020,12,31);
zuFrueh = new GregorianCalendar(2020,5,31);
zuSpaet = new GregorianCalendar(2021,1,01);
mittenDrin = new GregorianCalendar(2020,8,15);

produktIstErmaessigt= new Produkt("Mandelmus",true, 8.5);
produktNichtErmaessigt= new Produkt("Shampoo",false, 2.50);
}

@Test
public void ermaessigtUnd2020()
{
//act
double preis1= produktIstErmaessigt.berechneBruttopreis(untereGrenze);
double preis2= produktIstErmaessigt.berechneBruttopreis(obereGrenze);
double preis3= produktIstErmaessigt.berechneBruttopreis(mittenDrin);
//assert
assertEquals(8.92,preis1,0);
assertEquals(8.92,preis2,0);
assertEquals(8.92,preis3,0);
}

@Test
public void ermaessigtUndNicht2020()
{
//act
double preis1= produktIstErmaessigt.berechneBruttopreis(zuFrueh);
double preis2= produktIstErmaessigt.berechneBruttopreis(zuSpaet);

//assert
assertEquals(9.09, preis1,0);
assertEquals(9.09,preis2,0);

}

@Test
public void nichtErmaessigtUnd2020()
{
//act
double preis1= produktNichtErmaessigt.berechneBruttopreis(untereGrenze);
double preis2= produktNichtErmaessigt.berechneBruttopreis(obereGrenze);
double preis3= produktNichtErmaessigt.berechneBruttopreis(mittenDrin);

//assert
assertEquals(2.9,preis1,0);
assertEquals(2.9,preis2,0);
assertEquals(2.9,preis3,0);
}

@Test
public void NichtErmaessigtUndNicht2020()
{
//act
double preis1= produktNichtErmaessigt.berechneBruttopreis(zuFrueh);
double preis2= produktNichtErmaessigt.berechneBruttopreis(zuSpaet);

//assert
assertEquals(2.97,preis1,0);
assertEquals(2.97,preis2,0);
}

}[/CODE]

Hier tritt bei mir aber bei jeder Methode ein Fehler auf, dass die Werte nicht übereinstimmen. Wenn ich die Werte manuell in einer Starter-Klasse abrufe, kommen allerdings die richtigen Werte raus, also liegt der Fehler vermutlich in der Testklasse, aber ich verstehe nicht ganz wo, wäre super, wenn mir da jemand helfen könnte 🙂

[CODE lang="java" title="Starterklasse"]public class Start {

public static void main(String[] args)
{
Produkt produktIstErmaessigt, produktNichtErmaessigt;
Calendar untereGrenze, obereGrenze, zuFrueh, zuSpaet, mittenDrin;

//Werte festlegen Monate werden ab 0 gezählt
untereGrenze = new GregorianCalendar(2020,5,01);
obereGrenze = new GregorianCalendar(2020,11,31);
zuFrueh = new GregorianCalendar(2020,4,31);
zuSpaet = new GregorianCalendar(2021,0,01);
mittenDrin = new GregorianCalendar(2020,7,15);

produktIstErmaessigt= new Produkt("Mandelmus",true, 8.5);
produktNichtErmaessigt= new Produkt("Shampoo",false, 2.5);
System.out.println();

System.out.println("Mandelmus: "+ produktIstErmaessigt.berechneBruttopreis(obereGrenze));
System.out.println();
System.out.println("Mandelmus: "+ produktIstErmaessigt.berechneBruttopreis(untereGrenze));
System.out.println("Shampoo: "+ produktNichtErmaessigt.berechneBruttopreis(obereGrenze));
System.out.println("Shampoo: "+ produktNichtErmaessigt.berechneBruttopreis(untereGrenze));
}

}[/CODE]
 
Als erstes bitte immer die ganz genaue Meldung bringen. Was gibt er als erwarteten Wert aus und was gibt er als bekommenen Wert aus?

Ggf. liegt es einfach nur daran, dass Dein delta als 0 angegeben wurde...
 
Als erstes bitte immer die ganz genaue Meldung bringen. Was gibt er als erwarteten Wert aus und was gibt er als bekommenen Wert aus?

Ggf. liegt es einfach nur daran, dass Dein delta als 0 angegeben wurde...
Bei NichtErmaessigtUndNicht2020 will er 2.97 statt 2.9
bei ErmaessigtUnd2020 erwartet er 8.925 statt 9.09
bei nichtErmaessigtUnd2020 erwartet er 2.9 statt 2.97
und bei ermaessigtUndNicht2020 erwartet er 9.09 und bekommt 8.92

Die Werte sind also mehr oder weniger verdreht, aber ich weiß nicht, woran es liegt, da ich das Produkt ja eigentlich als ermäßigt bzw. nicht ermäßigt eingetragen habe und die Grenzen auch passen. Das Delta muss per Aufgabenstellung 0 sein, da wir aber nach der zweiten Nachkommastelle abschneiden sollen, müsste das passen, da ja nicht gerundet wird.
 
Da sind die Werte auch zu Dicht beieinander. Liegt es dann evtl. daran, dass die Monate um 1 verschoben sind? Im Test ist der Monat immer um 1 höher als in Deiner main Methode. Aber das ist nur ein Unterschied, der auffällt - da wir den Code selbst nicht kennen, kann man da nicht wirklich was sagen...
 
Da sind die Werte auch zu Dicht beieinander. Liegt es dann evtl. daran, dass die Monate um 1 verschoben sind? Im Test ist der Monat immer um 1 höher als in Deiner main Methode. Aber das ist nur ein Unterschied, der auffällt - da wir den Code selbst nicht kennen, kann man da nicht wirklich was sagen...
Ok wow, da wäre ich vermutlich erst übermorgen drauf gekommen 😅
Vielen Dank, daran hats gelegen, jetzt läuft es durch 😀
 
Nur so als Anmerkung am Rande: besser ist es, pro Test nur eine Assertion zu haben, aktuell hast du ja bis zu drei unabhängige pro Testfall 🙂


Wenn es doch mehrere sind (in manchen Fällen kann das sinnvoll sein), kann man dafür zB SoftAssertions (aus AssertJ) benutzen, bei denen dann auch immer alle Assertions ausgewertet werden, nur nicht die bis zur ersten fehlschlagenden – würde ich aber auch nur bei abhängigen Assertions nutzen.
 

Zurück
Oben