Как уведомить JUnit об исключениях, созданных в аннотированных методах @DataPoints?

Я реализовал общий тест для методов hashCode и equals, используя экспериментальную аннотацию JUnit @Theory. Сам класс тестового примера основан на версии dfa.

Однако, когда я пытался протестировать класс java.net.InetAddress, я столкнулся со своеобразной проблемой, если метод, предоставляющий точки данных, содержит код, который генерирует исключение (в данном случае UnknownHostException):

Поэтому я попробовал две альтернативы, которые привели к одному и тому же неудовлетворительному результату:

  1. Объявите метод как вызывающий соответствующее исключение:

    @DataPoints
    public static InetAddress[] declareException() throws UnknownHostException {
        return new InetAddress[] {
            InetAddress.getByName("not a valid internet address")
        };
    }
    
  2. Явно поймать исключение и повторно выдать как AssertionError:

    @DataPoints
    public static InetAddress[] rethrowAsAssertionError() {
        try {
            return new InetAddress[] {
                InetAddress.getByName("not a valid internet address")
            };
        } catch(UnknownHostException ex) {
            throw new AssertionError(ex);
        }
    }
    

В обоих случаях выдается AssertionError с бесполезным сообщением "Никогда не найдены параметры, удовлетворяющие предположениям метода. Нарушены предположения: []", что равнозначно отсутствию аннотированного метода @DataPoints в первую очередь. .

Кто-нибудь знает, есть ли способ распространить исключение на JUnit (и, в конечном счете, на пользователя) или это ошибка в JUnit?


person ThomasH    schedule 17.11.2011    source источник
comment
Почему ваш генератор точек данных выдает исключение? Разве вы не должны просто написать это таким образом, чтобы всегда генерировались действительные данные?   -  person unholysampler    schedule 17.11.2011
comment
В идеале да, но (а) никто не идеален, поэтому я не хочу просто проглатывать проверенные UnknownHostException, и (б) я могу придумать варианты использования (например, с использованием работающей базы данных/веб-сервера...), которые могут вызвать исключения даже для правильного кода. Поэтому необходим механизм для информирования пользователя о возникновении исключения.   -  person ThomasH    schedule 17.11.2011
comment
(a) Таким образом, поиск ошибки в вашем тесте занимает немного больше времени, ее все равно нужно исправить. (б) Похоже, вы больше не говорите о тестировании. В лучшем случае вы проводите интеграционное тестирование вместо модульного. Но если это так, то я думаю, что вы используете @DataPoints не так, как предполагалось. Данные должны быть значениями, которые должны давать детерминированные результаты, а не функцию тестируемого кода.   -  person unholysampler    schedule 17.11.2011
comment
@unholysampler re (b) Я мог бы представить себе сценарий, в котором база данных будет предоставлять тестовые данные, но я бы достиг, и мой конкретный случай включает сценарий (a). Да, ошибка должна быть исправлена, я не ратую за то, чтобы этого не было, но код тестирования и инструменты также должны сделать это как можно проще. Ответ Мэтью дает именно это. Это предупреждает меня об ошибке в моем генераторе точек данных.   -  person ThomasH    schedule 17.11.2011


Ответы (1)


Это известная проблема 137: исключения, скрытые в методах DataPoints.

Обходной путь — создать точки данных в @BeforeClass, а затем просто использовать их из точек данных:

private static InetAddress[] datapoints;

@BeforeClass
public static void generateData() throws UnknownHostException {
  // do all the work of generating the datapoints
  datapoints = new InetAddress[] {
    InetAddress.getByName("not a valid internet address")
  };
}

@DataPoints
public static InetAddress[] data() {
  return datapoints;
}

и это должно работать.

Ожидающий запрос на включение 328: исправления, связанные с @DataPoints, но в настоящее время он все еще находится в стадии обсуждения, он еще не принят.

person Matthew Farwell    schedule 17.11.2011
comment
Именно то, что я искал, спасибо. Кроме того, +1 за указание на то, что это известная проблема с ожидающим решения. - person ThomasH; 17.11.2011