Frage

Ich bin einen Test für ein Stück Code zu schreiben, der einen IOException Fang darin hat, dass ich zu decken bin versucht. Die try / catch sieht etwa so aus:

try {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
} catch (IOException e) {
    LOGGER.error("Bad news!", e);
} finally {

Der einfachste Weg scheint eine FileNotFoundException zu machen Fileoutputstream werfen, aber vielleicht über dies alles falsch, ich werde.

Jeder da draußen irgendwelche Tipps?

War es hilfreich?

Lösung

Von Ihrem Kommentar:

  

Ja, ich nehme die Frage sollte   wirklich gewesen „Wie erstelle ich ein   Datei, die nicht sowohl Linux auf existiert   und Windows?“Unter Windows kann ich   'New File ( "X: /")', wobei X: ein Laufwerk   Brief, der nicht existiert. Unter Linux   das funktioniert nicht, weil das a   gültige Dateiname.

Schauen Sie sich java.io.File.createTempFile. Verwenden Sie es, um die Datei zu erstellen und diese dann löschen.

es wahrscheinlich passieren so etwas wie:

File tempFile;

tempFile = createTempFile(getClass().getName(), 
                          Long.toString(System.currentTimeMillis());
tempFile.delete();

Das sollten Sie einen eindeutigen Namen in einer Plattform indendent Weise, dass Sie sicher und ohne (viel) Angst davor bestehenden verwenden können.

Andere Tipps

Sie könnten cacheFileName auf einen ungültigen Namen gesetzt oder auf einen Sie wissen, gibt es nicht.

Es gibt zwei Teile zu jedem Test: So funktioniert es geschehen und Messen, dass Sie das richtige Ergebnis bekamen

.

Fehlerinjektion

Die einfachste Antwort ist die, die bereits ist erwähnt, die cacheFileName in einer Datei festgelegt ist, die nie existiert. Dies ist wahrscheinlich die praktischste Antwort in dieser Situation.

Um jedoch eine beliebige Bedingung wie eine IOException zu verursachen, was Sie wirklich wollen, ist Fehlerinjektion . Dies zwingt Fehler im Code ohne dass Sie zum Instrument des Quellcodes. Hier sind ein paar Methoden, dies zu tun:

  • Mock-Objekte Sie können eine Factory-Methode verwenden, um eine überschriebene ObjectOutputStream oder FileOutputStream zu erstellen. Im Testcode wäre die Implementierung eines IOException werfen, wenn Sie wollten, und in der Produktion Code würde das normale Verhalten nicht ändern.
  • Dependency Injection Um Ihr Mock-Objekt an der richtigen Stelle bekommen Sie einen Rahmen wie Frühling oder Seam zu‚injizieren‘das entsprechende Objekt in der Klasse, die das tun hat Arbeit. Sie können sehen, dass diese Rahmenbedingungen auch eine Priorität für Objekte, die, eingespritzt werden, so dass während der Unit-Tests, um die Produktion von Objekten mit Testobjekten außer Kraft setzen kann.
  • Aspect Oriented Programming Anstatt die Änderung der Struktur bei allen Ihren Code können Sie AOP verwenden, um die Störung an der richtigen Stelle zu injizieren. Zum Beispiel AspectJ mit könnten Sie eine Pointcut wo Sie die Ausnahme wollte von geworfen werden, und haben die Rat die gewünschte Ausnahme werfen

Es gibt noch andere Antworten Injektion auf Java zu bemängeln; AProbe Pionier, was AOP in C vor langer Zeit genannt werden könnte, und sie auch habe ein Java-Produkt.

Validierung

gibt es die Ausnahme ausgelöst ist ein guter Anfang, aber Sie müssen auch überprüfen, ob Sie das richtige Ergebnis bekam. Unter der Annahme, dass die Codebeispiel Sie haben es richtig ist, wollen Sie bestätigen, dass Sie diese Ausnahme protokolliert. Jemand oben erwähnt ein Mock-Objekt für Ihre Logger, die eine praktikable Option ist. Sie können AOP auch hier verwenden Sie den Anruf an den Logger zu fangen.

Ich gehe davon aus, dass der Logger log4j ; ein ähnliches Problem zu lösen, ich meine eigenen log4j Appender implementiert, die log4j Ausgabe erfasst: Ich spezifisch nur ERROR und FATAL erfassen, die die interessanten Log-Meldungen in einem solchen Fall wahrscheinlich sind. Die appender wird in log4j.xml verwiesen und wird während des Testlaufs aktiviert Fehlerprotokoll ausgegeben zu erfassen. Dies ist im Wesentlichen ein Mock-Objekt, aber ich habe nicht alle meine Code neu strukturieren, die eine log4j Logger bekam.

  

Ich bin ein Test für ein Stück Code zu schreiben   das hat eine IOException Fang darin   dass ich versuche, zu decken.

Ich bin nicht ganz sicher, ob ich verstehe Ihr Ziel, aber wenn Sie testen möchten, ob die Ausnahme ausgelöst wird, können Sie den Test sagen, Sie erwarten, dass es die Ausnahme werfen:

@Test(expected=IOException.class)

Ihr Test wird dann fehlschlagen, wenn die Ausnahme nicht ausgelöst wird, und erfolgreich sein, wenn es geworfen wird (wie, wenn die cacheFileName Datei nicht existiert).

Ein FileNotFoundException würde den Fang offensichtlich auslösen. Die javadoc nennt die Fälle, in denen es geworfen wird.

Sie sollten auch bedenken, dass die Object Konstruktor kann eine IOException werfen, damit dieser Fall in Ihren Tests decken möchten.

Zwei einfache Möglichkeiten, entweder cacheFileName auf eine nicht vorhandene Datei oder stellen Sie die angegebene Datei eingestellt werden, würde nur zu lesenden Zugriff.

-Johannes

Wie der Code zur Zeit geschrieben wird, versuchen Sie könnten den Fehler () Aufruf auf dem LOGGER Objekt zu verspotten und überprüfen, um zu sehen, ob es aufgerufen wird, wenn Sie eine IOException erwartet.

Ihre Wunsch-Test hat ein grundsätzliches Problem mit dem Code aufgedeckt, wie es geschrieben ist. Ein Fehler auftritt, aber es gibt keine boolean oder Flag-Wert (die Dateinamen zu einem speziellen Muster festgelegt), die anderen Abschnitte des Codes liefert, um zu bestimmen, ob Schreiben in die Datei erfolgreich war. Wenn dies in einer Funktion enthalten ist, vielleicht könnten Sie einen boolean zurückgeben oder eine Objektebene Variable gesetzt.

cacheFileName = "thisFileShouldNeverExistAndIfItDoesYouAreScrewingUpMyTests";

Sicher, dass Sie Maßnahmen ergreifen könnte und durch Reifen springen programmatisch, um sicherzustellen, dass der Dateiname wird nie, nie, nie existiert, oder Sie können eine Zeichenfolge verwenden, die nie in 99,99999% der Fälle existieren wird.

Ich hoffe, das ist, was Sie gemeint.

if(new File(cachedFile).exists()) {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
    //do your code here
} else {
    throw new FileNotFoundException("File doesn't exist!");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top