Während ich einige Fälle testete, fand ich heraus, dass Sie den Fall wahrscheinlich nicht abgedeckt haben, wenn eine nicht abgeholte Exception geworfen wird.
das folgende Beispiel Gegeben:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.junit.Test;
public class CodeCoverageFinallyTest {
@Test
public void testMyMethod() {
myMethod("2015-08-31");
myMethod("wrongFormat");
}
private void myMethod(final String source) {
try {
new SimpleDateFormat("yyyy-MM-dd").parse(source);
} catch (final ParseException e) {
System.out.println("catch ParseException");
} finally {
System.out.println("finally");
}
}
}
Dieses Beispiel nur fangen wird einer der beiden Zweige in blockieren die schließlich, weil Sie den Fall nicht prüfen, ob eine ungeprüfte Ausnahme (dh eine Nullpointer) sein wird, geworfen.
Also, wenn Sie Ihren Testfall ein wenig ändern, werden Sie alle Zweige im finally-Block fangen:
public void testMyMethod() {
myMethod("2015-08-31");
myMethod("wrongFormat");
myMethod(null); // also cover the case, that an unchecked and unhandled exception
// will be thrown
}
In meinem anderen Testfall hatte ich einen sligthly anderen Fall mit einigem if-else-if
Konstrukt.
import org.junit.Test;
public class CodeCoverageIfElseTest {
@Test
public void testMyMethod() {
myMethod("2015-08-31");
myMethod("wrongFormat");
}
private void myMethod(final String source) {
if ("2015-08-31".equals(source)) {
System.out.println("Correct format");
} else if ("wrongFormat".equals(source)) {
System.out.println("Incorrect format");
}
}
}
Hier ist der else if
nicht den zweiten Zweig fangen, weil, was passiert, wenn die if
undelse if
Bedingung nicht wahr sein? Es wird auch abgefangen, wenn Sie andere Werte als die beiden in der if-else-if
-Anweisung angeben.
„Beachten Sie auch die spezielle Fang hinzugefügt Es wird in der Bytecode erscheinen auch wenn du explizit catch schreibst (Throwable t). " - Ich glaube, das ist falsch, d. H. 'Catch (java/lang/Throwable)' und 'catch (any)' - zwei unterschiedliche Ausnahme-Handler in Bytecode, selbst wenn 'Throwable' eine Basisklasse aller Fehler und Ausnahmen ist. –
Godin