JUnit Tests Konstruktor Testen
Jungs ich bin neu zu JUnit testen und zu versuchen, ein guter Griff, jetzt bin ich das schreiben von JUnit-tests für einen Konstruktor (für die Digraph-Klasse, entsteht ein gerichteter graph) throws IllegalArgumentException, wenn es liest negativen int-Wert und erstellt ein Diagramm, wenn alles in Ordnung ist (Anzahl der Knoten-Wert) ist größer als null.
Digraph-Klasse:
In in = new In();
public Digraph(In in) {
try {
this.nodes = in.readInt();
System.out.println("Total nodes in graph: "+ nodes);
if (nodes < 0) throw new IllegalArgumentException("Number of vertices must be > 0);
int E = in.readInt();
if (E < 0) throw new IllegalArgumentException("Number of edges must be >0);
}catch (NoSuchElementException e) {
throw new InputMismatchException("Invalid input format in Digraph constructor");
}
Unten ist der test, den ich bin versucht zu schreiben:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test(expected = IllegalArgumentException.class)
public void DigraphIn() {
Digraph G = new Digraph(in.readInt());
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Vertices can't be nagative");
exception.expectMessage("Invalid input format in Digraph constructor");
exception.expectMessage("Number of edges in a Digraph must be nonnegative");
try{
}catch (AssertionError e){
}
}
Wie soll ich testen beiden Fällen mit einem (oder zwei) Testfälle? Wenn es gibt keine-ve Wert erkannt "im" Kriege ich java.lang.AssertionError sonst test bestanden. Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte man haben, viele testcases.
Es ist gut zu haben, eine für jede Ausnahme.
Jeder test, den Sie durchführen, ist anders und muss anders behandelt werden.
Eine gute Referenz ist: Junit Cookbook.
Tatsächlich ich sah einen Fehler in Ihrem code.
In den test-Fällen können Sie verhöhnen die Mitarbeiter, als unten. Ich machte ein mock zurückgibt, die bei jedem Aufruf unterschiedliche Werte mit 'mockito' verspottet Bibliothek.
Benötigen Sie grundsätzlich so etwas wie:
Diese Weise test-code ist übersichtlicher und einfacher zu Lesen.
Digraph
Konstruktor zu Verhalten, als notwendig für diesen test.ExpectedException
ist besser, in diesem test kann man nicht überprüfen kann, wo die exception geworfen wird..Beim testen einer Methode, die Sie eigentlich nennen, die es ausführen. Der test kann nur überprüfen, eine Ausnahme pro test, da Sie die Ausnahme aufheben, den Rest bei der Verarbeitung der Methode. Sie brauchen also einen test für jeden der Orte, wo eine exception geworfen werden kann.
Sich bei der überprüfung eine exception geworfen wird mit einem unit-test, es gibt im Grunde 3 Möglichkeiten, es zu tun:
Einen try-catch-block:
Den
expected
-Attribut des@Test
- - Anmerkung:sowie
ExpectedException
:In Ihrem Beispiel, Ihrer versuchen, alle drei.
Vergleichen wir die Methoden der Prüfung für die Ausnahmen, die nur die erste und Dritte sind tatsächlich in der Lage, um überprüfungen auf die Ausnahme geworfen wird, weshalb Sie sich bevorzugt für Test-Methoden, bei denen die gleiche Art von exception geworfen werden kann von mehreren Orten, können Sie dann mit der exception-Nachricht, um zu überprüfen, dass die exception geworfen wurde, von der Stelle, die Sie ment es auf.
Die zweite ist bei weitem die meisten lesbar, aber nicht zulassen, Sie zu unterscheiden zwischen Ausnahmen, die ausgelöst durch die zu testende Methode, es ist nicht so viel Wert, wie die anderen beiden in den meisten Fällen.
Des ersten und Dritten, der Dritte ist mit Abstand der am meisten lesbar, und auch mein persönlicher Favorit.
Da die zu testende Methode können nur werfen eine Ausnahme pro Ausführung, es sollte eine Prüfmethode für jede der stellen, wo eine exception geworfen werden darf:
}