2017-02-18 10 views
1

У меня есть этот код:Как проверить, если причина Exception совпадает с типом исключения

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 брошено, это брошено другим исключением в другом классе. Я хочу проверить, соответствует ли исходное исключение ExceptionException некоторым настраиваемым исключениям, которые я создал. Как мне добиться этого с помощью JUnit?

+0

Вы можете использовать экземпляр 'e.getCause() экземпляра CustomException'. http://stackoverflow.com/questions/7526817/use-of-instance-of-in-java – aturkovic

+0

Да, но мне было интересно, есть ли у JUnit какой-то способ сделать это. Потому что, если я хочу проверить несколько исключений, он скоро станет уродливым. 'assertThat (e) .isInstanceOf (IllegalArgumentException.class)', например, больше не работает. Я думаю, что API изменился. –

ответ

2

Использование 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!")); 
} 
+0

Спасибо. Это почти идеально. Не могли бы вы поместить 'ExecutionException.class' внутри ожидать и' CustomException.class' внутри 'isA'? Потому что 'CustomException' не выбрасывается. 'CustomException' является причиной исключения. Я сразу приму это как ответ :) –

+0

Если вы хотите поймать исключение вместо того, чтобы позволить вашему коду выйти из строя, ответ GhostCats проще, чем использование ExpectedException, мой пример может быть лучше, если вы хотите, чтобы ваш тест завершился бросая исключение. – aturkovic

1

Easy, вы можете решить, что с помощью "встроенного" вещи (правила хороши, но здесь не требуется):

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

Другими словами : просто попробуйте эту причину; и затем утверждать все, что нужно утверждать. (Я использую assertThat и is(), см. here для дальнейшего чтения)

Смежные вопросы