Java: Junit4: тестирование исключений не работает, настаивает на блоке try-catch: - PullRequest
4 голосов
/ 08 февраля 2011

Мой тест: здесь подчеркивается материал после саксофона.и настаивает на том, что у меня есть блок try-catch .... но в интернете написано, что правильный способ проверки исключения - @Test(expected=IllegalArgumentException.class)

@Test(expected= XMLClientNotFoind.class)
public void testGetClientFromIP() throws XMLClientNotFound{
    ...
    assertEquals(c, sax.getClientFromIP("101.0.2.01"));
}

И метод getClientFromIP находится здесь:

  public Client getClientFromIP(String ip) throws XMLClientNotFound {
        ...
        throw new XMLClientNotFound();
  }

И мое исключение:

   public class XMLClientNotFound extends Exception{

    }

Ответы [ 3 ]

7 голосов
/ 08 февраля 2011

Прежде всего:

@Test(expected=IllegalArgumentException.class)

не следует рассматривать как правильный способ, особенно с таким общим исключением. Причина в том, что вы не можете контролировать, какой оператор в вашем методе тестирования на самом деле вызвал исключение. Также вы не можете делать какие-либо утверждения на ярлыке сообщения, причина и т. Д.

Использование try-catch, точно окружающее строку, которая, как предполагается, выдает исключение, является правильным путем:

try {
    shouldThrow()
    fail("Expected exception");
} catch(XMLClientNotFound e) {
    assertThat(e).hasMessage("Expected message");  //FEST-Assert syntax
}

Вы также можете попробовать JUnit @Rule, который я написал некоторое время назад, чтобы сделать ваш тест более читабельным.

1 голос
/ 08 февраля 2011

Вам все еще нужно определить предложение throws для проверенных исключений. @Test(expected=...) part просто говорит JUnit, что вы ожидаете, что ваш тестовый пример вызовет это исключение (я).

0 голосов
/ 09 февраля 2011

Возможно, у вас есть другой код в методе test, который выдает другое исключение?

Например ...

@Test(expected= XMLClientNotFoind.class)
public void testGetClientFromIP() throws XMLClientNotFound{

    thisMethodThrows_ExceptionX();

    assertEquals(c, sax.getClientFromIP("101.0.2.01"));
} 

В приведенном выше случае компилятор будет жаловаться, потому что вы не обрабатываете ExceptionX.Вам также нужно было бы использовать команду try / catch или сказать throws ExceptionX в сигнатуре метода тестирования.

В общем, хорошая идея проверить одну вещь в тестовом методе.Я не понимаю утверждение, если вы ожидаете, что метод сгенерирует исключение;утверждать нечего, потому что ничего не собирается возвращать.

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