2010-10-06 6 views

ответ

93

Некоторые случаи, когда я нашел его полезным:

  • маркировать тест, который является неполным, поэтому он не откажет и предупреждает вас, пока вы можете закончить его
  • убедившись, что генерируется исключение:
try{ 
    // do stuff... 
    fail("Exception not thrown"); 
}catch(Exception e){ 
    assertTrue(e.hasSomeFlag()); 
} 

Примечание:

С JUnit4, есть более элегантный способ проверить, что исключение бросают: Используйте аннотацию @Test(expected=IndexOutOfBoundsException.class)

Однако, это не будет работать, если вы также хотите проверить исключение, тогда вам все равно нужно fail().

+2

Рассмотрите это сообщение в блоге об относительных достоинствах сбоя и ожидаемой аннотации: http://blog.jooq.org/2016/01/20/use-junits-expected-exceptions-sparingly/ – lbalazscs

+0

@sleske ", если вы также хотите проверьте исключение, тогда вам все еще нужно fail() "- нет. ExpectedException - это путь, см. Https://github.com/junit-team/junit4/wiki/exception-testing – kraxor

+0

@kraxor: Правда, не знал об этом, когда писал ответ (вероятно, это было даже не вокруг тогда). – sleske

6

Я думаю, что обычный случай использования - это назвать его, когда исключение не было выброшено в отрицательный тест.

Что-то вроде следующего псевдокода:

test_addNilThrowsNullPointerException() 
{ 
    try { 
     foo.add(NIL);      // we expect a NullPointerException here 
     fail("No NullPointerException"); // cause the test to fail if we reach this    
    } catch (NullNullPointerException e) { 
     // OK got the expected exception 
    } 
} 
+2

Если вы не проверяете что-либо в блоке catch, вы можете использовать аннотацию метода @ExpectedException (NullNullPointerException.class), чтобы объявить, что вы ожидаете исключения (специального вида). – FrVaBe

9

позволяет сказать, что вы пишете тестовый пример для -ve потока, где код тестируемым должен вызвать исключение

try{ 
    bizMethod(badData); 
    fail(); // FAIL when no exception is thrown 
} catch (BizException e) { 
    assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR) 
} 
2

Это, как я использую метод обесточивания.

Есть три состояния, что ваш тест может закончиться в

  1. Зачет: Функция испытуемой успешно выполнена и возвращена данные, как ожидаются
  2. Не Сдали: Функция испытуемой успешно выполнена, но возвращаемые данные не как ожидалось
  3. Ошибка: функция не выполнить успешно, и это не было

предназначено (В отличие от отрицательных тестовых случаев, ожидающих возникновения исключения ).

Если вы используете eclipse, три состояния обозначаются зеленым, синим и красным маркерами соответственно.

Я использую операцию отказа для третьего сценария.

например. : public Integer add (integer a, Integer b) {return new Integer (a.intValue() + b.intValue())}

  1. Passed Дело: а = новый Interger (1), б = новое целое (2) и функция возвращается 3
  2. Не Passed Дело: а = новый Interger (1), б = новый Integer (2) и функция вернула значение SOEM, кроме 3
  3. Failed случая: = NULL, б = нуль и функция бросает NullPointerException
+0

Если вы посмотрите на исходный код JUnit, вы увидите, что в утверждениях используется 'fail()'. –

6

Я использовал его в том случае, когда что-то возможно, пошатнулись в моем методе @Before.

public Object obj; 

@Before 
public void setUp() { 
    // Do some set up 
    obj = new Object(); 
} 

@Test 
public void testObjectManipulation() { 
    if(obj == null) { 
     fail("obj should not be null"); 
    } 

    // Do some other valuable testing 
} 
+0

Да, предварительные условия тестирования хороши. Однако, если вы хотите убедиться, что метод '@ Before' преуспел, вероятно, лучше проверить его непосредственно в этом методе. В качестве бонуса, по крайней мере, JUnit и TestNG даже сообщают о другом сбое ошибок из методов '@ Before' /' @ After', поэтому можно увидеть, что проблема не была в самом тесте. – sleske

1

Я, например, использовать fail() указать тесты, которые еще не завершены (это бывает); в противном случае они будут демонстрироваться как успешные.

Возможно, это связано с тем, что я не знаю какой-то неполной() функциональности, которая существует в NUnit.

4

просто использовать:

org.junit.Assert.fail("Exception expected"); 
0

Наиболее важный для использования случай, вероятно, проверка исключений.

В то время как junit4 содержит expected element для проверки того, произошло ли исключение, похоже, что он не является частью нового junit5. Другим преимуществом использования fail() по сравнению с expected является то, что вы можете комбинировать его с finally, позволяющим очищать тестовый корпус.

dao.insert(obj); 
try { 
    dao.insert(obj); 
    fail("No DuplicateKeyException thrown."); 
} catch (DuplicateKeyException e) { 
    assertEquals("Error code doesn't match", 123, e.getErrorCode()); 
} finally { 
    //cleanup 
    dao.delete(obj); 
} 

Как указано в другом комментарии. Испытание на провал до тех пор, пока вы не сможете закончить его реализацию, также кажется разумным.

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