In meinem Beitrag Unit-Testing: Exceptions testen habe ich gezeigt, wie sich Exceptions mit JUnit testen lassen, ohne dabei die Teststruktur verändern zu müssen (Arrange-Act-Assert; Given-When-Then) oder zusätzliche Bibliotheken verwenden zu müssen:
@Test public void methodThrowsException() { IllegalArgumentException ex = foo(someIllegalArgument); assertThat(ex.getMessage(), is("foobarfoo")); } private Exception foo(FooBarFoo fooBarFoo) { try { subjectUnderTest.foo(someIllegalArgument); return null; } catch (IllegalArgumentException ex) { return ex; } }
Dank Java 8 und Lambdas lässt sich der Code vereinfachen:
@Test public void methodThrowsException() { Exception ex = tryCall(() -> subjectUnderTest.foo(someIllegalArgument)); assertThat(ex.getMessage(), is("foobarfoo")); } private Exception tryCall(Callable<?> callable) { try { callable.call(); return null; } catch (Exception ex) { return ex; } }
Die Vereinfachung besteht nun darin, dass die Methode tryCall in eine Hilfsklasse ausgelagert werden kann – sie ist jetzt unabhängig vom konkreten Testfall.