Myślę, że to pytanie wymaga zaktualizowanej odpowiedzi, ponieważ większość odpowiedzi tutaj jest dość nieaktualna.
Po pierwsze, na pytanie PO:
Myślę, że całkiem dobrze przyjęto, że wprowadzenie koncepcji „oczekiwanego wyjątku” do JUnit było złym posunięciem, ponieważ ten wyjątek można zgłosić w dowolnym miejscu i zda on test. Działa, jeśli wyrzucasz (i potwierdzasz) wyjątki specyficzne dla domeny, ale tego typu wyjątki rzucam tylko wtedy, gdy pracuję nad kodem, który musi być absolutnie nieskazitelny, - większość APIS po prostu wyrzuci wbudowane wyjątki, takie jak IllegalArgumentException
lub IllegalStateException
. Jeśli dwa wywołania, które wykonujesz, mogą potencjalnie spowodować te wyjątki, to@ExpectedException
adnotacja zielony pasek twojego testu, nawet jeśli jest to zła linia, która zgłasza wyjątek!
W tej sytuacji napisałem zajęcia, które na pewno napisało wielu innych, to jest assertThrows
metoda:
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;
}
}
}
}
ta metoda po prostu zwraca, jeśli wyjątek zostanie zgłoszony, umożliwiając wykonanie dalszych asercji / weryfikacji w teście.
dzięki składni java 8 twój test wygląda naprawdę ładnie. Poniżej znajduje się jeden z prostszych testów na naszym modelu wykorzystującym metodę:
@Test
public void when_input_lower_bound_is_greater_than_upper_bound_axis_should_throw_illegal_arg() {
AxisRange range = new AxisRange(0,100);
Runnable act = () -> range.setLowerBound(200);
assertThrows(IllegalArgumentException.class, act);
}
testy te są trochę dziwne, ponieważ krok „działaj” w rzeczywistości nie wykonuje żadnej czynności, ale myślę, że znaczenie jest nadal dość jasne.
na maven jest też mała biblioteka o nazwie catch -ception, która używa składni w stylu mockito, aby sprawdzić, czy wyjątki są generowane. Wygląda ładnie, ale nie jestem fanem dynamicznych proxy. To powiedziawszy, składnia jest tak zręczna, że pozostaje kusząca:
List myList = new ArrayList();
catchException(myList).get(1);
assert caughtException() instanceof IndexOutOfBoundsException;
Na koniec, w sytuacji, w której znalazłem się, aby dostać się do tego wątku, istnieje sposób na zignorowanie testów, jeśli zostanie spełniony jakiś warunek.
W tej chwili pracuję nad uzyskaniem niektórych bibliotek DLL wywoływanych przez bibliotekę java natywną ładującą bibliotekę o nazwie JNA, ale nasz serwer kompilacji jest w systemie Ubuntu. Lubię próbować napędzać ten rodzaj rozwoju za pomocą testów JUnit - chociaż w tym momencie są one dalekie od „jednostek” -. Chcę przeprowadzić test, jeśli jestem na komputerze lokalnym, ale zignorować test, jeśli jesteśmy na Ubuntu. JUnit 4 ma na to przepis, zwany Assume
:
@Test
public void when_asking_JNA_to_load_a_dll() throws URISyntaxException {
Assume.assumeFalse(BootstrappingUtilities.isCircleCI());
URL url = DLLTestFixture.class.getResource("USERDLL.dll");
String path = url.toURI().getPath();
path = path.substring(0, path.lastIndexOf("/"));
NativeLibrary.addSearchPath("USERDLL", path);
Object dll = Native.loadLibrary("USERDLL", NativeCallbacks.EmptyInterface.class);
assertThat(dll).isNotNull();
}