Ich denke, diese Frage braucht eine aktualisierte Antwort, da die meisten Antworten hier ziemlich veraltet sind.
Zum einen auf die Frage des OP:
Ich denke, es ist ziemlich gut angenommen, dass die „erwartete excepetion“ -Konzept in JUnit Einführung war ein schlechter Schachzug, da diese Ausnahme überall angehoben werden könnte, und es wird den Test bestehen. Es funktioniert, wenn Sie sehr domänenspezifische Exceptions werfen (und behaupten), aber ich werfe nur diese Art von Exceptions, wenn ich an Code arbeite, der absolut einwandfrei sein muss, - am meisten APIS wird einfach die eingebauten Ausnahmen wie IllegalArgumentException
werfen oder IllegalStateException
. Wenn zwei Aufrufe Ihre Erzeugung könnte potentally diese Ausnahmen werfen, dann wird die @ExpectedException
Annotation Ihren Test grün-bar, auch wenn es die falsche Linie ist, die die Ausnahme auslöst!
Für diese Situation ich eine Klasse geschrieben habe, die ich bin sicher, dass viele andere hier geschrieben haben, das ist ein assertThrows
Methode:
public class Exceptions {
private Exceptions(){}
public static void assertThrows(Class<? extends Exception> expectedException, Runnable actionThatShouldThrow){
try{
actionThatShouldThrow.run();
fail("expected action to throw " + expectedException.getSimpleName() + " but it did not.");
}
catch(Exception e){
if (! expectedException.isInstance(e)) {
throw e;
}
}
}
}
diese Methode einfach zurück, wenn die Ausnahme ausgelöst wird, so dass Sie tun weitere Aussagen/Verifizierungen in Ihrem Test
mit Java 8 Syntax sieht Ihr Test wirklich gut aus.Im Folgenden finden Sie eine der einfacheren Tests auf unserem Modell, das die Methode verwendet:
@Test
public void when_input_lower_bound_is_greater_than_upper_bound_axis_should_throw_illegal_arg() {
//setup
AxisRange range = new AxisRange(0,100);
//act
Runnable act =() -> range.setLowerBound(200);
//assert
assertThrows(IllegalArgumentException.class, act);
}
diese Tests ein wenig wackelig sind, weil die „handeln“ Schritt eine Aktion nicht wirklich durchführen, aber ich denke, dass die Bedeutung noch recht ist klar.
Es gibt auch eine winzige kleine Bibliothek namens catch-exception, die die Mockito-Syntax verwendet, um zu überprüfen, ob Ausnahmen ausgelöst werden. Es sieht hübsch aus, aber ich bin kein Fan von dynamischen Proxies. Das heißt, es Syntax ist so glatt bleibt es verlockend:
// given: an empty list
List myList = new ArrayList();
// when: we try to get the first element of the list
// then: catch the exception if any is thrown
catchException(myList).get(1);
// then: we expect an IndexOutOfBoundsException
assert caughtException() instanceof IndexOutOfBoundsException;
schließlich für die Situation, die ich in lief auf diesen Thread zu bekommen, gibt es eine Möglichkeit, um ignorieren-Tests, wenn einige conidition erfüllt ist.
Momentan arbeite ich daran, einige DLLs über eine java native-library-loading-library namens JNA aufzurufen, aber unser Build-Server ist in ubuntu. Ich möchte versuchen, diese Art der Entwicklung mit JUnit-Tests voranzutreiben - auch wenn sie an dieser Stelle noch weit von "Einheiten" entfernt sind. Ich möchte den Test ausführen, wenn ich auf einem lokalen Computer bin, aber den Test ignorieren, wenn wir auf Ubuntu sind. JUnit 4 hat hierfür eine Rückstellung haben, die so genannte Assume
:
@Test
public void when_asking_JNA_to_load_a_dll() throws URISyntaxException {
//this line will cause the test to be branded as "ignored" when "isCircleCI"
//(the machine running ubuntu is running this test) is true.
Assume.assumeFalse(BootstrappingUtilities.isCircleCI());
//an ignored test will typically result in some qualifier being put on the results,
//but will also not typically prevent a green-ton most platforms.
//setup
URL url = DLLTestFixture.class.getResource("USERDLL.dll");
String path = url.toURI().getPath();
path = path.substring(0, path.lastIndexOf("/"));
//act
NativeLibrary.addSearchPath("USERDLL", path);
Object dll = Native.loadLibrary("USERDLL", NativeCallbacks.EmptyInterface.class);
//assert
assertThat(dll).isNotNull();
}
Verwenden Sie einfach Return-Anweisung - in den meisten Fällen wird dies als pass() übergeben. – topchef
@topchef dieser einzelne Kommentar traf den Hammer auf den Kopf, während alle anderen darüber diskutieren, was akzeptabel ist und was nicht. –
Einige Testsysteme (perl Test :: Simple) zählen bestandene und fehlgeschlagene Assertions. Junit zählt jedoch die Anzahl der _test-Methoden, die bestanden und nicht bestanden haben. Daher hat Junit nicht den gleichen Nutzen für eine "Pass" -Methode. –