Test auf Exceptions schreiben

Mariexshhx

Bekanntes Mitglied
Java:
@Test
void test_divideByZero() {
    Executable code = new Executable() {
        public void execute() throws Throwable {
            Division.div(2, 0);
        }
    };
    ArithmeticException exception = assertThrows(ArithmeticException.class,
            code);
    assertThat(exception.getMessage()).contains("by zero");
}
wieso muss der Methodenaufruf bei testen auf eine Exception in ein executable Objekt gespeichert werden ?

alos wieso reicht nicht der alleinige Methodenaufruf ?
Code:
@Test
void test_divideByZero() {
    ArithmeticException exception = assertThrows(ArithmeticException.class,
            Division.div(2, 0););
    assertThat(exception.getMessage()).contains("by zero");
}
 

KonradN

Super-Moderator
Mitarbeiter
Bei deiner zweiten Variante würde assertThrows mit dem Ergebnis des Aufrufes ausgeführt. Das willst Du aber nicht, denn
1. gibt die Methode kein Executable zurück (Und das ist der Typ des zweiten Parameters)
2. würde die Exception bei der Evaluierung der Parameter geworfen ...

Sinn ist es ja, dass das, was ausgeführt werden soll, erst von der assertThrows Methode aufgerufen wird.

Was man hier hat ist also ganz einfach verallgemeinert:
Die Methode assertThrows erwartet ein Parameter der vom Typ eines funktionalen Interfaces ist, damit kann diese Methode aufgerufen werden:
a) mit einer Instanz des Interfaces (was Dein Code macht)
b) mit einer Lambda Expression, also etwas wie () -> Division.div(2,0)
c) mit einer Methodenreferenz

Das wäre so die Java Sicht auf das, was da gemacht wird bzw gemacht werden kann.
 

LimDul

Top Contributor
Das wird so ggf. nicht kompilieren und funktionieren.
Wenn div eine checked Exception wirft, muss du sie entweder fangen oder weiterwerfen. Dein zweiter Code macht gar nichts davon. die assertThrows Methode bekommt die Exception nie zu sehen.

Java ruft Division.div(2,0) auf um den Rückgabewert in die Methode assertThrows zu stecken. Nur leider gibt die Methode nichts zurück, sondern wirft eine Exception. Damit greift das Exception-Handling, assertThrows wird nie aufgerufen und da es keinen catch Block gibt, wird die Exception weitergeworfen.
 

Mariexshhx

Bekanntes Mitglied
achso deswegen muss quasi die Exception einem einem Executable gespeichert werden damit man mit der Exception dann die assertThrow Methode aufruft ?
Das wird so ggf. nicht kompilieren und funktionieren.
Wenn div eine checked Exception wirft, muss du sie entweder fangen oder weiterwerfen. Dein zweiter Code macht gar nichts davon. die assertThrows Methode bekommt die Exception nie zu sehen.

Java ruft Division.div(2,0) auf um den Rückgabewert in die Methode assertThrows zu stecken. Nur leider gibt die Methode nichts zurück, sondern wirft eine Exception. Damit greift das Exception-Handling, assertThrows wird nie aufgerufen und da es keinen catch Block gibt, wird die Exception weitergeworfen.
 

Mariexshhx

Bekanntes Mitglied
Bei deiner zweiten Variante würde assertThrows mit dem Ergebnis des Aufrufes ausgeführt. Das willst Du aber nicht, denn
1. gibt die Methode kein Executable zurück (Und das ist der Typ des zweiten Parameters)
2. würde die Exception bei der Evaluierung der Parameter geworfen ...

Sinn ist es ja, dass das, was ausgeführt werden soll, erst von der assertThrows Methode aufgerufen wird.

Was man hier hat ist also ganz einfach verallgemeinert:
Die Methode assertThrows erwartet ein Parameter der vom Typ eines funktionalen Interfaces ist, damit kann diese Methode aufgerufen werden:
a) mit einer Instanz des Interfaces (was Dein Code macht)
b) mit einer Lambda Expression, also etwas wie () -> Division.div(2,0)
c) mit einer Methodenreferenz

Das wäre so die Java Sicht auf das, was da gemacht wird bzw gemacht werden kann.
wenn assertThrow bei dem zweiten Beispiel nie aufgerufen wird, was steckt denn dann aber in der Variablen exception ?
 

KonradN

Super-Moderator
Mitarbeiter
wenn assertThrow bei dem zweiten Beispiel nie aufgerufen wird, was steckt denn dann aber in der Variablen exception ?
Da die Auswertung des zweiten Parameters eine Exception wirft, wird assertThrows nicht aufgerufen und exception wird nichts zugewiesen. Die Ausführung endet an der Stelle, an der die Exception geworfen wurde und dann geht es den Stacktrace zurück bis entweder die Exception behandelt wurde oder eben der Thread endet.
 

Mariexshhx

Bekanntes Mitglied
Da die Auswertung des zweiten Parameters eine Exception wirft, wird assertThrows nicht aufgerufen und exception wird nichts zugewiesen. Die Ausführung endet an der Stelle, an der die Exception geworfen wurde und dann geht es den Stacktrace zurück bis entweder die Exception behandelt wurde oder eben der Thread endet.
und was genau macht die execute Methode dagegen vezögert sie das Werfen der Exception oder wie genau?
 

KonradN

Super-Moderator
Mitarbeiter
Die execute Methode ruft ja einfach nur den Code auf, der die erwartete Exception auslösen soll.

assertThrows macht also unter dem Strich etwas wie (stark vereinfacht):
Java:
Exception assertThrows(Class exceptionClass, Executable executable) {
    try {
        executable.execute();
        fail();
    } catch (Exception ex) {
        assertTrue(exceptionClass.isInstance(ex)); // stark vereinfacht.
        return ex;
    }
}

Es wird also ausgeführt und die Exception gefangen. Wenn keine Exception geworfen wurde, dann ist der Test fehlgeschlagen. Und wenn eine Exception geworfen wurde, dann wird der Typ geprüft. Stark vereinfacht und das würde so nicht übersetzen .. aber es wird hoffentlich deutlich, was dieses assertThrows macht.
 

Mariexshhx

Bekanntes Mitglied
Die execute Methode ruft ja einfach nur den Code auf, der die erwartete Exception auslösen soll.

assertThrows macht also unter dem Strich etwas wie (stark vereinfacht):
Java:
Exception assertThrows(Class exceptionClass, Executable executable) {
    try {
        executable.execute();
        fail();
    } catch (Exception ex) {
        assertTrue(exceptionClass.isInstance(ex)); // stark vereinfacht.
        return ex;
    }
}

Es wird also ausgeführt und die Exception gefangen. Wenn keine Exception geworfen wurde, dann ist der Test fehlgeschlagen. Und wenn eine Exception geworfen wurde, dann wird der Typ geprüft. Stark vereinfacht und das würde so nicht übersetzen .. aber es wird hoffentlich deutlich, was dieses assertThrows macht.
assertThrow prüft dann also den Typen der Exception falls es eine gibt ?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
D Hilfe bei Calculator Test Java Basics - Anfänger-Themen 15
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
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 JUnitTest Best Practise (Ein Assert pro Test?) Java Basics - Anfänger-Themen 10
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
Mr_Kleeblatt Operatoren if (arri[i] != "test.java"&& arri[i] != "test.class") Java Basics - Anfänger-Themen 3
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
D Test auf Dopplungen Java Basics - Anfänger-Themen 32
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
B zzz.test Java Basics - Anfänger-Themen 13
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
C Erste Schritte Hexidezimal-Test 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
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
T Minesweeper Test Java Basics - Anfänger-Themen 2
S Junit Test Java Basics - Anfänger-Themen 2
F Test Java Basics - Anfänger-Themen 12
W Ist das ein legitimer Test? Java Basics - Anfänger-Themen 5
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
U Best Practice Datenbereitstellung Unit Test Java Basics - Anfänger-Themen 6
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
Z Vererbung Test auf Normalverteilung, Wilcoxon Java Basics - Anfänger-Themen 3
M Assertion NotNull Test Java Basics - Anfänger-Themen 3
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
W Test, ob Datei existiert, schlägt fehl Java Basics - Anfänger-Themen 4
T JUnit test failed Java Basics - Anfänger-Themen 3
H Array Test Methode schreiben Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
V Bruchrechner Test Java Basics - Anfänger-Themen 7
T Test läuft schief Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
x22 Java Multiple Choice Test Java Basics - Anfänger-Themen 8
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
N Test mit assert Java Basics - Anfänger-Themen 9
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
K Palindrom Test Java Basics - Anfänger-Themen 9
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
V Mediaplayer - NullPointerException bei Unit-Test Java Basics - Anfänger-Themen 4
H Ich kann mein Java Programm Test.class nicht ausführen Java Basics - Anfänger-Themen 6
H Javabefehl Test Java Basics - Anfänger-Themen 3
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
H lucas-test Java Basics - Anfänger-Themen 14
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
N Test Datei = Bild Java Basics - Anfänger-Themen 5
S Erste Schritte 1. Test Programm Java Basics - Anfänger-Themen 21
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
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
E Am Mittwoch Test und ich checks überhaupt nich Java Basics - Anfänger-Themen 27
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
J JUnit Test Java Basics - Anfänger-Themen 2
D Test einer Chipkarte Java Basics - Anfänger-Themen 2
J Problem mit Test-Klasse Java Basics - Anfänger-Themen 4
E Test, ob String in Double umwandelbar ist Java Basics - Anfänger-Themen 3
J Test steht vor der Tür !! Java Basics - Anfänger-Themen 2
X Array nur mit Zahlen (test) Java Basics - Anfänger-Themen 11
Houly JUnit Test Suite anlegen Java Basics - Anfänger-Themen 6
F Primitiver Lucas-Lehmer-Test hängt sich auf Java Basics - Anfänger-Themen 7
M Erster HashMap-test Java Basics - Anfänger-Themen 5
O Test auf JComponent Java Basics - Anfänger-Themen 7
pun Junit Test erkennt Exception nicht.. Java Basics - Anfänger-Themen 14
D C0 und C1 Test nochmal Java Basics - Anfänger-Themen 9
D C0 und C1 Test Java Basics - Anfänger-Themen 3
G BlueJ jUnit Test Java Basics - Anfänger-Themen 6
J Test auf UTF-8 Java Basics - Anfänger-Themen 2
M Wo und wie speich. ich .java und wo den zugehörigen test? Java Basics - Anfänger-Themen 2
Shalimar Test, ob mehr pos. oder neg. Zahlen Java Basics - Anfänger-Themen 3
M test Java Basics - Anfänger-Themen 5
M test Java Basics - Anfänger-Themen 2
M test Java Basics - Anfänger-Themen 10
V Test mit JUnit verbinden Java Basics - Anfänger-Themen 3
M test Java Basics - Anfänger-Themen 4
H Miller Rabin Test Primzahlen werden teilweise nicht gefunden Java Basics - Anfänger-Themen 5
C Multiple Choice Test Java Java Basics - Anfänger-Themen 5
G Grundfläche färben, ein Bild (NORTH) ind Test darunter? Java Basics - Anfänger-Themen 6
M Palindrom Test mit Char-arrays! Java Basics - Anfänger-Themen 3
M Java Test Übungsfragen Hilfe! Java Basics - Anfänger-Themen 5
B JUnit Test Klasse Rational Java Basics - Anfänger-Themen 12
N class Test<E extends MyAbstractClass> => typ von E? Java Basics - Anfänger-Themen 5
G jar cvf test.war -C src/ WEB-INF -C src/ ALLE JSP Wildcard? Java Basics - Anfänger-Themen 2
0 Quadratzahl-Test Java Basics - Anfänger-Themen 4
C Unsupported major.minor bei jUnit Test Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben