Перед Java 5.0 используйте -Xdebug
и -Xrunjdwp
аргументы. Эти опции будут все еще работать в более поздних версиях, но это будет работать в интерпретируемом режиме вместо JIT, который будет медленнее.
От Java 5.0, лучше использовать -agentlib:jdwp
единственная опция:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044
Опции на -Xrunjdwp
или agentlib:jdwp
аргументы:
transport=dt_socket
: означает, что путь раньше соединялся с JVM (сокет является хорошим выбором, это может использоваться для отладки удаленного компьютера) address=8000
: представленный порт TCP/IP, для соединения от отладчика, suspend=y
: если 'y', скажите JVM ожидать, пока отладчик не присоединен, начинают выполнение, иначе (если 'n'), запускает выполнение сразу же. Фактически, старый стиль ] проверка исключения заключается в том, чтобы обернуть блок try вокруг кода, который вызывает исключение, а затем добавить оператор fail ()
в конец блока try. Примерно так:
public void testNullParameter() {
try {
IPAddress addr = new IPAddress(null);
fail("InvalidIPAddressException not thrown.");
} catch(InvalidIPAddressException e) {
assertNotNull(e.getMessage());
}
}
Это не сильно отличается от того, что вы написали, но:
assertTrue (addr.getOctets () == null);
бесполезен. Тем не менее, это немного некрасиво. Но именно здесь на помощь приходит JUnit 4, поскольку тестирование исключений - одно из самых больших улучшений в JUnit 4. Теперь с JUnit 4 вы можете написать свой тест следующим образом:
@Test (expected=InvalidIPAddressException.class)
public void testNullParameter() throws InvalidIPAddressException {
IPAddress addr = new IPAddress(null);
}
Прекрасно, не так ли?
Теперь Что касается реального вопроса, если я не ожидаю, что будет сгенерировано исключение, я определенно выберу способ №1 (потому что он менее подробный) и позволю JUnit обработать исключение и не пройти тест, как ожидалось.
Для тестов, где я не ожидаю исключения, я не пытаюсь его поймать. Я позволил JUnit перехватить исключение (он делает это надежно) и вообще не обслуживаю его, за исключением объявления причины throw
(если требуется).
Я отмечаю re. ваш первый пример , что вы не используете аннотацию @expected
, а именно
@Test (expected=IndexOutOfBoundsException.class) public void elementAt() {
int[] intArray = new int[10];
int i = intArray[20]; // Should throw IndexOutOfBoundsException
}
Я использую это для всех тестов, которые я тестирую для выдачи исключений. Он короче, чем эквивалентный шаблон перехвата / сбоя, который мне приходилось использовать с Junit3.
Для нулевого теста вы можете просто сделать это:
public void testNullParameter() {
try {
IPAddress addr = new IPAddress(null);
fail("InvalidIPAddressException not thrown.");
}
catch(InvalidIPAddressException e) { }
}
Если исключение содержит сообщение, вы также можете проверить это сообщение в перехвате, если хотите. Например,
String actual = e.getMessage();
assertEquals("Null is not a valid IP Address", actual);
Для правильного теста вам не нужно перехватывать исключение. Тест автоматически завершится ошибкой, если исключение было сгенерировано, но не обнаружено. Так что способ №1 будет всем, что вам нужно, так как он не удастся, и трассировка стека будет доступна вам в любом случае для вашего удовольствия от просмотра.
Если я понимаю ваш вопрос, ответ будет либо - личные предпочтения.
лично я бросаю свои исключения в тесты. на мой взгляд, отказ теста из-за утверждения эквивалентен провалу теста из-за неперехваченного исключения. в обоих есть что-то, что необходимо исправить.
при тестировании важно помнить о покрытии кода.
В общем случае путь №1 - это правильный путь, нет причин указывать на сбой из-за ошибки - в любом случае тест по существу провалился.
Единственный способ №2 имеет смысл, если вам нужно хорошее сообщение о том, что пошло не так, и просто исключение не даст вам этого. Тогда ловля и неудача могут иметь смысл, чтобы лучше объявить причину отказа.