A library that supports exception testing with Java 8 Lambdas. Can be used with JUnit and TestNG.
I strongly recommend to use Fishbowl instead of Vallado, because it makes it possible to use the AAA (Arrange-Act-Assert) pattern for writing tests for code that throws an exception.
An example is worth a thousand words.
when(() -> throw new RuntimeException())
.thenA(RuntimeException.class)
.isThrown();
1. Import the when
method.
import static org.junit.contrib.java.lang.throwable.When.when;
2. Enclose the code that throws the exception with when
.
when(() -> { /* code that throws an exception */ })
3. Specify the exception's type.
when( … )
.thenA(FooBarException.class)
4. Optionally specify further assertions for the exception by using Hamcrest matchers.
when( … )
.thenA( … )
.that(hasProperty("message", startsWith("A")))
.and(hasProperty("message", contains("foo bar")))
5. Execute the code and verify that the specified exception is thrown.
when( … )
.thenA( … )
…
.isThrown();
You can use Vallado with an older version of Java, too. Therefore you have
to creates Statement
objects.
when(new Statement() {
public void evaluate() {
throw new RuntimeException();
}
})
.thenA(RuntimeException.class)
.isThrown();
Fishbowl makes it possible to use the AAA (Arrange-Act-Assert) pattern for writing tests for code that throws an exception. The following snippet is the example from above but written with Fishbowl and Hamcrest
Throwable exception = exceptionThrownBy(() -> throw new RuntimeException());
assertThat(exception, is(instanceOf(RuntimeException.class)));
Rafał Borowiec wrote the Blog article JUnit: testing exception with Java 8 and Lambda Expressions, where he describes a similar approach to test exception handling. His equivalent to the example from above is
assertThrown(() -> throw new RuntimeException())
.isInstanceOf(RuntimeException.class);