Ответы:
Некоторые случаи, когда я нашел это полезным:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
Примечание:
Начиная с JUnit4, существует более элегантный способ проверить возникновение исключения: использовать аннотацию @Test(expected=IndexOutOfBoundsException.class)
Однако это не сработает, если вы также хотите проверить исключение, тогда вам все равно нужно fail()
.
Я думаю, что обычным вариантом использования является вызов его, когда в отрицательном тесте не было создано исключение.
Что-то вроде следующего псевдокода:
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
}
}
Я использовал его в том случае, когда что-то могло пойти не так в моем методе @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
}
@Before
метод успешен, вероятно, лучше проверить его непосредственно в этом методе. В качестве бонуса, по крайней мере, JUnit и TestNG даже сообщат о другом сбое для ошибок из @Before
/ @After
methods, так что можно увидеть, что проблема не в самом тесте.
Вот как я использую метод Fail.
Есть три состояния, в которых ваш тестовый пример может закончиться
предназначено (в отличие от отрицательных тестовых случаев, которые ожидают возникновения исключения).
Если вы используете eclipse, три состояния обозначаются зеленым, синим и красным маркером соответственно.
Я использую операцию отказа для третьего сценария.
например: public Integer add (integer a, Integer b) {return new Integer (a.intValue () + b.intValue ())}
fail()
.
Я, например, использую fail()
для обозначения тестов, которые еще не закончены (бывает); в противном случае они были бы успешными.
Возможно, это связано с тем, что я не знаю о какой-то неполной функции (), которая существует в NUnit.
В параллельных и / или асинхронных настройках вы можете проверить, что определенные методы (например, делегаты, прослушиватели событий, обработчики ответов, вы называете это) не вызываются. Помимо имитации фреймворков, вы можете вызвать fail()
эти методы, чтобы не пройти тесты. Истекшие тайм-ауты - еще одно естественное условие отказа в таких сценариях.
Например:
final CountDownLatch latch = new CountDownLatch(1);
service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
@Override
public void onSuccess(SomeType result) {
assertNotNull(result);
// Further test assertions on the result
latch.countDown();
}
@Override
public void onError(Exception e) {
fail(exception.getMessage());
latch.countDown();
}
});
if ( !latch.await(5, TimeUnit.SECONDS) ) {
fail("No response after 5s");
}
Вероятно, наиболее важным вариантом использования является проверка исключений.
Хотя junit4 включает ожидаемый элемент для проверки того, произошло ли исключение, похоже, что он не является частью более нового 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);
}
Как отмечено в другом комментарии. Также разумно иметь возможность провалить тест, пока вы не завершите его реализацию.