2013-03-12 6 views
3

Я делаю сценарии с JUnit4 для проекта.Ожидаемое исключение JUnit4

В одном из тестов мне нужно проверить ожидаемое исключение. С JUnit4 я делаю это, используя аннотацию.

@Test(expected=...) 

Теперь проблема заключается в том, что под код в тесте, который выбрасывает исключение, есть некоторые другие аннотации, мне нужно, чтобы проверить, не получить те или иную строчку. Пример Дан:

@Test(expected=NullPointerException.class) 
    public void nullPointerTest() { 
     Object o = null; 
     o.toString(); 
     assertTrue(false); 
    } 

Это тесты проходит, потому что он получает NullPointerException однако, очевидно, ошибка утверждения с asserTrue (ложными) и, таким образом, я хочу, чтобы потерпеть неудачу.

Каков наилучший способ исправить это? Решение этого может быть следующим, но я не знаю, правильно ли это это сделать.

@Test 
public void nullPointerTest2() { 
    boolean caught = false; 
    try{ 
     Object o = null; 
     o.toString(); 
    } 
    catch(NullPointerException e) 
    { 
     caught = true; 
    } 
    assertTrue(caught); 
    assertTrue(false); 
} 

Это второе испытание не соответствует прогнозу.

+0

Почему вы делаете 'assertTrue (false)'? Или это стоит здесь для некоторых ваших реальных тестов? Этот «реальный» код зависит от кода перед ним, который выдает «NullPointerException»? – rgettman

+0

Я не уверен, почему вы хотели бы это сделать. Он пахнет плохим дизайном теста. Каждый тест должен проверять только на одно. – Aurand

+1

Я предлагаю вам разделить это на два отдельных теста. –

ответ

3

JUnit4 ведет себя как ожидалось: при вызове исключения выполнение не продолжается. Таким образом, получается NullPointerException, метод тестирования завершается, JUnit4 отмечает его как проходящий, потому что вы ожидали исключения. Код после нулевой разыскивания фактически не существует.

Если вы хотите поведение второго теста, то то, что вы написали, является хорошим решением. Но это странно. Мне кажется, что вы объединяете два разных теста. Один тест должен проверить, что исключение выбрасывается в исключительных обстоятельствах. Второй тест должен проверять все проверки второго утверждения.

+0

Я не согласен с тем, что приведенный выше пример является «странным». Учтите, что в случае исключения, которое подвергается тестируемому классу, он может также выполнять другие проверяемые шаги до выброса исключения (например, освобождение ресурсов, регистрация ошибки, состояние обновления и т. Д.) –

+0

Да, и если это делая вещи * до * к исключению, тогда все будет работать. Если ранние утверждения терпят неудачу, тест завершится неудачно. Если последующее исключение не выбрасывается, то тест завершится с ошибкой. Что странно, ожидая, что тест выкинет исключение, а затем * после этого * что-нибудь предпримет. Исключение - это конец функции (иначе ее не бросают, ее поймают). –

4

Рассмотрим:

@Test(expected=NullPointerException.class) 
public void nullPointerTest2() { 
    boolean caught = false; 
    try{ 
    Object o = null; 
    o.toString(); 
    } 
    catch(NullPointerException e) 
    { 
    // test other stuff here 
    throw e; 
    } 
} 

Это позволяет дополнительных проверок в то же время в полной мере воспользоваться встроенной проверки исключений JUnit в.

Кроме того, я считаю использование @Rule ExpectedException лучшим вариантом, который во многих случаях является expected.

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