Test pro Funktionalität statt pro Methode

Ich finde es problematisch, in Unittests pro Methode zu testen, statt jede Funktionalität einzeln. Im großen und ganzen stellt zwar jede Methode eine Funktionalität dar, aber am Beispiel vom EitherTest sieht man, dass jeweils eine Unterscheidung zwischen Left und Right gemacht werden muss.

Insbesondere ist dieser Test kritisch zu betrachten:

public void testGetRight() throws Exception {
    //Right
    Either<Integer, String> right = Either.right("foo");
    assertEquals("foo", right.getRight());

    //Left
    Either<Integer, String> left = Either.left(42);
    left.getRight();
}```

Wenn ich den Test jetzt wie folgt modifiziere, ist er immer noch grün, obwohl der Test eigentlich fehlschlagen sollte:
```@Test(expected = NoSuchElementException.class)
public void testGetRight() throws Exception {
    //Right
    Either<Integer, String> right = Either.right("foo");
    assertEquals("foo", right.getLeft());

    //Left
    Either<Integer, String> left = Either.left(42);
    left.getLeft();
}```

Zumindest Tests bei denen eine Exception erwartet wird, sollten daher gesplittet werden.
Damit einhergehend müsste natürlich auch die Namensgebung angepasst werden. Sprechendere Namen, die die Funktionalität beschreiben, wären dann sinnvoll.

Beispiel: `getRightThrowsNoSuchElementExceptionIfCalledOnLeft`
Das klingt vielleicht erst einmal sperrig, das zugrunde liegende Problem ist aber schon in der Liste der roten Tests erkennbar, ohne auch nur in den Testcode sehen zu müssen.

Und was spricht dagegen jede Methode mehrnals zu testen bei verschiedenen Input? Dachte das ist der Sinn von Unittesting?

In Ordnung, halte ich für sinnvoll, auch wenn ich die Methode eher getRightOnLeft oder so nennen würde.

Allerdings schlägt die zweite Test-Variante bei mir fehl: java.lang.AssertionError: Expected exception: java.util.NoSuchElementException
@cmrudolph Könntest du das ändern? Wäre auch gleich ein Test, ob bei dir das git commit funktioniert.

Interessant. Sowohl in der IDE als auch per maven ausgeführt ist der modifizierte Test bei mir grün. Was eigentlich auch logisch ist, weil das Problem ist, dass die Exception schon im assertEquals() fliegt.

Commit funktioniert - nachdem ich meine Commit-Emailadresse in meinem Profil als weitere Emailadresse hinzugefügt habe, werden die Commits auch meinem Account zugeordnet. Die Aktualisierung ist aber erst nach einem weiteren Commit erfolgt.

Oh, da hatte ich was überlesen, du hast natürlich recht.