Невоспитанность для JUnit тестирует для выдачи исключения?

Перед 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'), запускает выполнение сразу же.
56
задан Seth 2 December 2009 в 22:37
поделиться

5 ответов

Фактически, старый стиль ] проверка исключения заключается в том, чтобы обернуть блок try вокруг кода, который вызывает исключение, а затем добавить оператор fail () в конец блока try. Примерно так:

public void testNullParameter() {
    try {
        IPAddress addr = new IPAddress(null);
        fail("InvalidIPAddressException not thrown.");
    } catch(InvalidIPAddressException e) {
        assertNotNull(e.getMessage());
    }
}

Это не сильно отличается от того, что вы написали, но:

  1. Ваш assertTrue (addr.getOctets () == null); бесполезен.
  2. Намерение и синтаксис более понятны IMO и, следовательно, их легче читать.

Тем не менее, это немного некрасиво. Но именно здесь на помощь приходит JUnit 4, поскольку тестирование исключений - одно из самых больших улучшений в JUnit 4. Теперь с JUnit 4 вы можете написать свой тест следующим образом:

@Test (expected=InvalidIPAddressException.class) 
public void testNullParameter() throws InvalidIPAddressException {
    IPAddress addr = new IPAddress(null);
}

Прекрасно, не так ли?

Теперь Что касается реального вопроса, если я не ожидаю, что будет сгенерировано исключение, я определенно выберу способ №1 (потому что он менее подробный) и позволю JUnit обработать исключение и не пройти тест, как ожидалось.

92
ответ дан 26 November 2019 в 17:19
поделиться

Для тестов, где я не ожидаю исключения, я не пытаюсь его поймать. Я позволил JUnit перехватить исключение (он делает это надежно) и вообще не обслуживаю его, за исключением объявления причины throw (если требуется).

Я отмечаю re. ваш первый пример , что вы не используете аннотацию @expected , а именно

@Test (expected=IndexOutOfBoundsException.class) public void elementAt() {
    int[] intArray = new int[10];

    int i = intArray[20]; // Should throw IndexOutOfBoundsException
  }

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

10
ответ дан 26 November 2019 в 17:19
поделиться

Для нулевого теста вы можете просто сделать это:

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 будет всем, что вам нужно, так как он не удастся, и трассировка стека будет доступна вам в любом случае для вашего удовольствия от просмотра.

0
ответ дан 26 November 2019 в 17:19
поделиться

Если я понимаю ваш вопрос, ответ будет либо - личные предпочтения.

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

при тестировании важно помнить о покрытии кода.

0
ответ дан 26 November 2019 в 17:19
поделиться

В общем случае путь №1 - это правильный путь, нет причин указывать на сбой из-за ошибки - в любом случае тест по существу провалился.

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

0
ответ дан 26 November 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: