java 如何检查异常原因是否与异常类型匹配

k2arahey  于 2023-02-02  发布在  Java
关注(0)|答案(3)|浏览(174)

我有这个代码:

CompletableFuture<SomeClass> future = someInstance.getSomething(-902);
try {
    future.get(15, TimeUnit.SECONDS);
    fail("Print some error");
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    // Here I want to check if e.getCause() matches some exception
} catch (TimeoutException e) {
    e.printStackTrace();
}

所以当抛出ExecutionException时,它是由另一个类中的另一个异常抛出的。我想检查导致ExecutionException的原始异常是否与我创建的某个自定义异常匹配。我如何使用JUnit实现这一点?

ghhkc1vu

ghhkc1vu1#

像这样使用ExpectedException

@Rule
public final ExpectedException expectedException = ExpectedException.none();

@Test
public void testExceptionCause() throws Exception {
    expectedException.expect(ExecutionException.class);
    expectedException.expectCause(isA(CustomException.class));

    throw new ExecutionException(new CustomException("My message!"));
}
5anewei6

5anewei62#

很简单,你可以使用"内置"的东西来解决这个问题(规则很好,但在这里不是必需的):

catch (ExecutionException e) {
  assertThat(e.getCause(), is(SomeException.class));

换句话说:把原因找出来;然后Assert任何需要Assert的内容(我使用了assertThat和is()匹配器;更多信息请参见here

aydmsdu9

aydmsdu93#

如果您只是想检查异常原因的类型,可以非常容易地完成
假设我们期望SQLIntegrityConstraintViolationException是原因,那么当我们有Exception对象时,我们可以检查其原因的类类型,例如:

Exception ex = Assertion.assertThrows(RuntimeExcpetion.class, () -> someMethodWhichWillThrowRuntimeException());
Assertions.assertEquals(SQLIntegrityConstraintViolationException.class, ex.getCause().getClass());

希望这有帮助!!

相关问题