我一直在寻找一些好的解决方案,但是,没有一个解决方案真正令我满意。 因此,我创建了自己的。
public final void assertThrows(VoidFunction v, Class extends Exception> e) {
try {
v.call();
} catch (Exception ex) {
if (!ex.getClass().equals(e)) {
Assert.fail();
}
// Do nothing, basically succeeds test if same exception was thrown.
return;
}
// Fails if no exception is thrown by default.
Assert.fail();
}
其中VoidFunction是一个简单的接口:
@FunctionalInterface
public interface VoidFunction {
void call();
}
用法如下(例如):
@Test
public void testFoo() {
assertThrows(() -> foo.bar(null)), NullPointerException.class);
assertThrows(() -> foo.setPositiveInt(-5)), IllegalArgumentException.class);
assertThrows(() -> foo.getObjectAt(-100)), IndexOutOfBoundsException.class);
assertThrows(new VoidFunction() {
@Override
public void call() {
foo.getObjectAt(-100);
}
}, IndexOutOfBoundsException.class); // Success
assertThrows(new VoidFunction() {
@Override
public void call() {
throw new Exception();
}
}, NullPointerException.class); // Fail
}
我在不使用lambda的情况下进行了一次调用,这使有时更容易理解代码,至少对我而言。使用简单,并且允许在一个方法中捕获多个异常。