Подтвердить что ты не робот

Исключения для исключения JUnit

Я действительно новичок в java.

Я запускаю некоторые тесты JUnit для конструктора. Конструктор таков, что если для одного из его параметров задана пустая или пустая строка, она должна выбрасывать исключение.

Когда я тестирую этот конструктор в JUnit с нулевым или пустым параметром строки, я получаю красную полосу, хотя я почти на 100% уверен, что метод конструктора действительно генерирует исключение, когда такие параметры передаются в Это.

Должна ли быть зеленая полоса в JUnit, если метод генерирует исключение так, как это предполагается? Или это значит, что когда вы должны получить красную полосу, когда срабатывание исключения работает так, как предполагается?

4b9b3361

Ответ 1

@Test(expected = Exception.class)  

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

За

@Test

Junit будет считать тест неудачным, если выброшено исключение, при условии, что это исключение не проверено. Если исключение отмечено, оно не скомпилируется, и вам нужно будет использовать другие методы. Эта ссылка может помочь.

Ответ 2

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

для нового junit ( >= 4.7), вы можете использовать что-то вроде (от здесь)

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void testRodneCisloRok(){
    exception.expect(IllegalArgumentException.class);
    exception.expectMessage("error1");
    new RodneCislo("891415",dopocitej("891415"));
}

и для старшего junit:

@Test(expected = ArithmeticException.class)  
public void divisionWithException() {  
  int i = 1/0;
}

Ответ 3

Признак использования ExpectedException Rule (версия 4.7) заключается в том, что вы можете протестировать сообщение об исключении, а не только ожидаемое исключение.

И используя Matchers, вы можете проверить часть интересующего вас сообщения:

exception.expectMessage(containsString("income: -1000.0"));

Ответ 4

Если ваш конструктор похож на этот:

public Example(String example) {
    if (example == null) {
        throw new NullPointerException();
    }
    //do fun things with valid example here
}

Затем, когда вы запустите этот тест JUnit, вы получите зеленую полосу:

@Test(expected = NullPointerException.class)
public void constructorShouldThrowNullPointerException() {
    Example example = new Example(null);
}

Ответ 5

Хотя @Test(expected = MyException.class) и правило ExpectedException являются очень хорошими вариантами, есть некоторые примеры, когда исключение исключений в стиле JUnit3 по-прежнему является лучшим путь:

@Test public void yourTest() {
  try {
    systemUnderTest.doStuff();
    fail("MyException expected.");
  } catch (MyException expected) {

    // Though the ExpectedException rule lets you write matchers about
    // exceptions, it is sometimes useful to inspect the object directly.

    assertEquals(1301, expected.getMyErrorCode());
  }

  // In both @Test(expected=...) and ExpectedException code, the
  // exception-throwing line will be the last executed line, because Java will
  // still traverse the call stack until it reaches a try block--which will be
  // inside the JUnit framework in those cases. The only way to prevent this
  // behavior is to use your own try block.

  // This is especially useful to test the state of the system after the
  // exception is caught.

  assertTrue(systemUnderTest.isInErrorState());
}

Другая библиотека, которая утверждает, что здесь помогает, - catch-exception; однако, по состоянию на май 2014 года, проект, похоже, находится в режиме обслуживания (устаревший по Java 8), и очень похоже на исключение catch-catch Mockito может обрабатывать только методы final.