Wie teste ich eine geworfene Exception?

Diskutiere Wie teste ich eine geworfene Exception? im Java Basics - Anfänger-Themen Bereich.
N

nikva

Hallo Java-Forum,,
Ich will folgende Methode mittels Junit5 testen, doch verstehe nicht ganz wie AssertThrows funktioniert
Java:
        if (food == null) {
            throw new NothingToAddException();
        }
        content.add(food);
    }
Ich habe es wie folgt versucht aber kriege eine NullpointerException. Ich nehme mal an das liegt daran, dass ich bei mir keine message liefere
Java:
    @Test
    void addFoodsNullTest() {
        Box<Cake> testBox2 = new Box<Cake>(1, 0.50, "testBox");
        NothingToAddException thrown = assertThrows(NothingToAddException.class, () -> testBox2.addFood(null));

        assertTrue(thrown.getMessage().contains(""));
    }
 
mrBrown

mrBrown

Was genau willst du denn testen?
Das assertThrows testet, dass die Exception geworfen wird – wenn es dir nur darum geht, brauchst du nicht mehr.

Wenn du testen willst, dass die Message der Exception einen leeren String enthält, dann ist die NPE ja auch völlig richtig – die Message ist wohl null, der Test hat also den Fehler gezeigt.
 
N

nikva

Ich will eigentlich nur testen ob die Exception geworfen wird, aber dazu brauch ich ja nicht den vergleich mit der nicht existenten message
Ich hönnte doch theoretisch auch die Exception in der Testklasse catchen?
 
mrBrown

mrBrown

L

LimDul

Der Code reicht dann völlig:
Java:
    @Test
    void addFoodsNullTest() {
        Box<Cake> testBox2 = new Box<Cake>(1, 0.50, "testBox");
        assertThrows(NothingToAddException.class, () -> testBox2.addFood(null));
    }
 
N

nikva

Wenn ich bei folgender zu testender Methode so vorgehe failed die assertion, da die Exception nicht geworfen wird, sondern innerhalb der selben Methode behandelt wird. Wie behandle ich sowas dann in einem Test?
Java:
    public void addItem(int rowNumber, int columnNumber, Product productToAdd) {
        try {

            if (rowNumber > this.shelf.length | rowNumber < 0) {
                throw new InvalidRowException(rowNumber);
            }
            if (columnNumber > this.shelf[0].length | columnNumber < 0) {
                throw new InvalidColumnException(columnNumber);
            }
            if (productToAdd instanceof Placeable == false) {
                throw new ProductNotPlaceablException(productToAdd);
            }
            if (this.shelf[rowNumber][columnNumber] != null) {
                System.out.println(
                        "Replacing product with serial " + this.shelf[rowNumber][columnNumber].getProductSerial()
                                + " with product with serial " + productToAdd.getSerialID());
                this.shelf[rowNumber][columnNumber] = (Placeable) productToAdd;

            }
            this.shelf[rowNumber][columnNumber] = (Placeable) productToAdd;

        } catch (InvalidRowException e) {

        } catch (InvalidColumnException e) {

        } catch (ProductNotPlaceablException e) {

        }
    }
Java:
    @Test
    void invalidRowShelfTest() {
        Shelf<Placeable> testShelf1 = new Shelf<Placeable>(4, 4);
        Bottle testBottle1 = new Bottle(1, 1, "test");
        assertThrows(InvalidRowException.class, () -> testShelf1.addItem(99, 1, testBottle1));

    }
 
mrBrown

mrBrown

Wenn ich bei folgender zu testender Methode so vorgehe failed die assertion, da die Exception nicht geworfen wird, sondern innerhalb der selben Methode behandelt wird. Wie behandle ich sowas dann in einem Test?
Naja, du überlegst dir, was die Methode machen soll, und testest dann genau das.

Wenn die Methode keine Exception werfen soll, dann stellst du im Test sicher, dass auch keine geworfen wird.


(Allerdings sieht die Methode nach völligem Unsinn aus. Eine Exception werfen, um sie in der gleichen Methode zu fangen, ist nahezu immer falsch. Gleiches gilt für einen leeren Catch-Block.)
 
N

nikva

Also soll ich sie einfach an die main methode zurückwerfen? Dachte das wäre zu vermeiden?
 
mrBrown

mrBrown

Nein; du musst sie dort fangen, wo du die Exception sinnvoll behandeln kannst. Wenn das erst in der Main ist, dann ist das so.

So wie du es aktuell löst, ist es in jedem Fall Unsinn – du könntest auf die Exception verzichten und es würde sich keine Änderung des Verhaltens feststellen lassen. Stattdessen soll die ja grade dazu dienen, den Fehler an den Aufrufer weiterzugeben,
 
Thema: 

Wie teste ich eine geworfene Exception?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben