Тестирование JUnit с ожиданиями исключений (несколько утверждений) - PullRequest
4 голосов
/ 20 декабря 2011

Я тестирую WeekConverter для использования в Xalan и задаюсь вопросом, что именно делает мой тест. : D

Имея следующий метод испытаний:

@Test(expected = IllegalArgumentException.class)
  public void testConvertTwoDigitYearWithWrongInput() {
  WeekConverter weekConverter = new WeekConverter(WeekConverter.Strategy.TWO_DIGIT_YEAR);

  //wrong or empty inputs
  assertEquals("0", weekConverter.convert(""));
  assertEquals("0", weekConverter.convert("abcdefgh"));
}

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

У меня также есть тест для нуля, который выдает NullPointerException . Мягкая проверка следующая:

if (inputDate == null) {
  do something and throw NullPointerexception
} else if (inputDate.isEmpty()) {
  do something and throw IllegalArgumentException, since inputDate is not really null
} else if (inputDate.matches(regex)) {
  go futher and convert
} else {
  do something and throw IllegalArgumentException, since inputDate does not match regex
}

Следовательно, один метод тестирования ожидает IllegalArgumentException с двумя утверждениями. Но очевидно, что мне нужны два разных метода тестирования, не только для уважения функциональности JUnit, но и для того, чтобы ожидать выброс из двух разных состояний.

Ответы [ 5 ]

3 голосов
/ 20 декабря 2011

Вы можете разбить ваш метод на несколько методов, но если у вас много входных выборок, это будет неудобно.

Вместо этого вы можете использовать следующий подход:

@Test
public void testConvertTwoDigitYearWithWrongInput() {
    WeekConverter weekConverter = new WeekConverter(WeekConverter.Strategy.TWO_DIGIT_YEAR); 

    assertFailsToConvert(weekConverter, ""); 
    assertFailsToConvert(weekConverter, "abcdefgh");
}

private void assertFailsToConvert(WeekConverter weekConverter, String input) {
    try {
        weekConverter.convert(input);
        fail("Should not convert [" + input + "]");
    } catch (IllegalArgumentException ex) {}
}
1 голос
/ 22 июня 2012

Попробуйте catch-исключение :

@Test
public void testConvertTwoDigitYearWithWrongInput() {

    WeekConverter weekConverter = ...

    // wrong or empty inputs
    verifyException(weekConverter, IllegalArgumentException.class)
       .convert("");
    verifyException(weekConverter, IllegalArgumentException.class)
       .convert("abcdefgh");
}
1 голос
/ 27 декабря 2011

Вы можете поместить создание преобразователя в отдельный метод установки @Before, а затем вы можете иметь (три) отдельных тестовых случая для работы с null, "" и "abcdef".

Если есть еще случаи для тестирования, в JUnit есть отличный способ - использовать аннотацию @ Parameters и соответствующий участник.

Ваш тестовый класс будет иметь дело только с неверными двухзначными годами.Его конструктор будет параметризован с помощью inputDate типа String.

Статический метод, выдающий @Parameters, вернет коллекцию, содержащую "" и abcdefg (и другие забавные случаи).

В одном тестовом случае можно ожидать IllegalArgumentException.

@RunWith(Parameterized.class)
public class IncorrectTwoDigitYears {
    String inputDate;

    public IncorrectTwoDigitYears(String inputDate) {
        this.inputDate = inputDate;
    }

    @Test(expected = IllegalArgumentException.class)
    public void testFormat() {
        (new WeekConverter(WeekConverter.Strategy.TWO_DIGIT_YEAR))
            .convert(inputDate);
    }

    @Parameters
    public static Collection<Object[]> data() {
       Object[][] data = new Object[][] { 
           { "" }, { "abcdef" }, { "0" }, { "000" }, { "##" } };
       return Arrays.asList(data);
    }
}

Окупаемость будет выше, если у вас будет более двух тестов.

1 голос
/ 20 декабря 2011

Тест просто ожидает, что IllegalArgumentException генерируется вне зависимости от того, куда или почему он генерируется.

Я рекомендую разделить его на два теста.

1 голос
/ 20 декабря 2011

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

Исключение будет выдано при первом получении преобразователем недопустимого аргумента.

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

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