Schreiben Junit-test zu decken, Ausnahme-und catch-block
Habe ich geschrieben Junit-Testfall für folgende Funktion. Wenn die Option aktiviert ist JACOCO Testabdeckung. Es zeigt nur try-block ist bedeckt von test-Fall. Ich bin Neuling auf dem schreiben von Testfällen. Wie die exceptions und catch-block kann abgedeckt werden, die in Testfällen
Hier ist eine Methode
public static List<Student> readCsvFile(String fileName)
{
BufferedReader fileReader = null;
//logic to read file
}
catch (Exception e)
{
System.out.println("Error in CsvFileReader !!!");
e.printStackTrace();
} finally
{
try
{
fileReader.close();
} catch (IOException e)
{
System.out.println("Error while closing fileReader !!!");
e.printStackTrace();
}
}
return students;
}
Und TestMethod
@Test
public void ReadCsvFileTest()
{
String fileName = "test.csv";
List<Student> result = new ArrayList<Student>();
result = CsvFileReader.readCsvFile(fileName);
Student student1 = null;
Iterator<Student> it = result.iterator();
while (it.hasNext())
{
Student s = it.next();
if ("471908US".equals(s.getId()))
{
student1 = s;
break;
}
}
assertTrue(student1 != null);
}
- Du bekommst nur die Abdeckung für die exception-block wird eine Ausnahme geworfen.
CsvFileReader.readCsvFile("notexisting.csv")
sollten Sie die fangen- Als Kompass empfehlen Sie eine Ausnahme innerhalb des try-Blocks während der Testausführung. Normalerweise würde ich die Verwendung eines mocking-Frameworks wie Mockito um dies zu erreichen. Aber vielleicht ist in Ihrem Fall reicht es aus, übergeben Sie einen ungültigen Dateinamen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In solchen Situationen kann man oft betrachten die Einführung von zusätzlichen Abhängigkeiten zu Ihrer Klasse. Hier ist, was ich meine, mit einem groben Beispiel. Erstellen Sie eine Fabrik für die Leser:
Dann haben Sie eine triviale Implementierung, Bedarf kaum testen, z.B. etwas ähnliches:
Dann müssen Sie einen Weg finden, um zu injizieren, diese Abhängigkeit in Ihrer Klasse. Normalerweise verwende ich Guice in meiner täglichen Arbeit, aber Sie können versuchen, etwas so einfaches wie über constructor injection und machen Ihre Methode nicht statisch. Hier ist ein Beispiel:
Mit einem mocking-framework wie Mockito das Verhalten dieser Klasse im Fall von
IOException
-s ist einfacher zu testen jetzt (beachten Sie, dass Sie möglicherweise auch zurück, mocks, die Ausnahmen aus der Fabrik). Hier ist ein Beispiel:Können Sie dies tun, ohne Mockito, natürlich - durch die Implementierung einer test factory. Aber das ist eher umständlich, vor allem in komplizierteren Fällen verwenden. Sobald die
IOException
geworfen wird, erhalten Sie entsprechende Berichterstattung Bericht von JaCoCo.Auch mind eine Einschränkung des JaCoCo erwähnt hier, in Abschnitt Source-code-Zeilen mit Ausnahmen zeigen, keine Abdeckung. Warum?
Angesichts der aktuellen Signatur der Methode in der Erprobung, erste volle Deckung ist nicht leicht: Ihre catch-block wird nur ausgeführt, wenn eine Ausnahme geworfen wird, in Ihrem try-block.
Einen Weg, um dieses Problem zu lösen: nicht-pass in den Namen der Datei, sondern das reader-Objekt selbst. Wie:
Nun können Sie schreiben mehrere bestimmte unit-tests für die zweite Methode. Halten Sie Ihre tests, die einfach das tun, "richtig" zu Lesen; aber Sie fügen ein, wo Sie übergeben eine verspottet reader-Objekt ... dass Sie einfach eine Exception wirft irgendwann. Bitte beachten Sie, dass ich machte, dass die neue Methode nur package - protected- Sie wollen wahrscheinlich nicht zu verwenden, dass "öffentlich" und privat würde verhindern, dass es als Einheit getestet.
Die Ihnen helfen sollen eine vollständige Abdeckung. Natürlich müssen Sie auch mindestens einen test, um die "Deckung" der string-Methode nehmend, zu.
Einige Hinweise: