Тестирование на несколько исключений с JUnit 4 аннотации

Пример: в файле web.xml тег

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

И chat.properties вы можете объявить свои свойства следующим образом:

Для Ex:

Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.
26
задан phantom-99w 11 September 2009 в 21:30
поделиться

6 ответов

Вы действительно хотите, чтобы тест выполнял одну вещь и проверял ее. Если вы не уверены, какое именно исключение будет выдано, для меня это не будет хорошим испытанием.

например. (в псевдокоде)

try {
   badOperation();
   /// looks like we succeeded. Not good! Fail the test
   fail();
}
catch (ExpectedException e) {
   // that's fine
}
catch (UnexpectedException e) {
   // that's NOT fine. Fail the test
}

, поэтому, если вы хотите проверить, что ваш метод выдает 2 разных исключения (для 2 наборов входных данных), вам понадобится 2 теста.

23
ответ дан Brian Agnew 25 September 2019 в 07:24
поделиться

Используйте catch-исключение :

// test 
public void testDo() {

   // obj.do(1) must throw either A or B
   catchException(obj).do(1);
   assert caughtException() instanceof A
       || caughtException() instanceof B;

   // obj.do(2) must throw A but not SubclassOfA
   catchException(obj).do(2);
   assert caughtException() instanceof A
       && !(caughtException() instanceof SubclassOfA);

}
3
ответ дан rwitzel 25 September 2019 в 07:24
поделиться

Как бы вы ожидали, что «ожидаемые» будут работать? Метод может выдать только одно исключение.

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

0
ответ дан Michael Lloyd Lee mlk 25 September 2019 в 07:24
поделиться
@Test(expected=Exception.class)

Это выбросит все возможные исключения.

1
ответ дан Anthony Mendonca 25 September 2019 в 07:24
поделиться

Делайте тесты как можно более простыми и короткими. Цель JUnit-Test - проверить только одну простую функциональность или один единственный способ отказа.

Действительно, в целях безопасности вы должны создать по крайней мере один тест для всех возможных способов выполнения.

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

Будьте краткими и простыми.

У вас может быть 30-40 методов тестирования для одного отдельного метод легко ... это действительно важно?

С уважением

0
ответ дан 28 November 2019 в 07:20
поделиться

Это невозможно с аннотацией.

В JUnit 4.7 вы можете использовать новое правило ExpectedException

public static class HasExpectedException {
    @Interceptor
    public ExpectedException thrown= new ExpectedException();

    @Test
    public void throwsNothing() {
    }

    @Test
    public void throwsNullPointerException() {
         thrown.expect(NullPointerException.class);
         throw new NullPointerException();
    }

    @Test
    public void throwsNullPointerExceptionWithMessage() {
        thrown.expect(NullPointerException.class);
        thrown.expectMessage("happened?");
        throw new NullPointerException("What happened?");
    }
}

Подробнее см.


Если обновление до JUnit 4.7 для вас невозможно, вы должны написать чистый модульный тест в форме

public test() {
    try {
        methodCall(); // should throw Exception
        fail();
    }
    catch (Exception ex) {
        assert((ex instanceof A) || (ex instanceof B) || ...etc...);
        ...
    }

}

12
ответ дан 28 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

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