Протестируйте метод, если он вызовет исключение или нет, не вызывая его - PullRequest
3 голосов
/ 21 июля 2011

Как я могу проверить, будет ли данный метод генерировать исключение или нет (в зависимости от переданного объекта), не вызывая его?

Например:

public static boolean isAllowed(SomeObject obj)
{
    try
    {
        myMethod(obj);
        return true;
    }
    catch(Exception ex)
    {
        return false;
    }
}

но приведенный выше метод будет выполнять MyMethod(), как я могу добиться этого в Java?

EDIT:

На самом деле, я хочу сделать это, чтобы проверить имя файла. см. это: Проверка имени файла в Windows

Ответы [ 7 ]

6 голосов
/ 21 июля 2011

Как уже говорили другие, вообще невозможно сказать, будет ли выброшено исключение на основе входных данных без фактического его вычисления. Java завершена, так что это сводится к проблеме остановки . Однако вы можете найти все исключения, которые метод может выдать во время выполнения:

try {
    Method myMethod = this.getClass().getMethod("myMethod");
    System.out.println(Arrays.toString(myMethod.getExceptionTypes()));
} catch (NoSuchMethodException e) {}
3 голосов
/ 21 июля 2011

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

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

Из «Эффективной Java» Джошуа Блоха:

Класс с «зависимым от состояния» методом, который может быть вызвантолько при определенных непредсказуемых условиях, как правило, должен быть отдельный метод «проверки состояния», указывающий, целесообразно ли вызывать метод, зависящий от состояния.

2 голосов
/ 21 июля 2011

В общем случае вы не можете.Например, рассматриваемый метод может использовать генератор случайных чисел, чтобы решить, бросить ли исключение или нет.Или для более реалистичного примера: если рассматриваемый метод пытается открыть файл, то вы не можете заранее знать, может ли какой-то другой процесс удалить этот файл непосредственно перед тем, как вы попытаетесь открыть его (что может вызвать исключение).

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

1 голос
/ 21 июля 2011

Лучше понять методы и действительные параметры, чем вслепую проверять методы перед вызовом (что невозможно).

Проверьте ваши параметры перед передачей их методу. Вот тривиальная иллюстрация, где передача нуля вызовет исключение:

int getLength(String s)
{
  return s.length();
}

void someMethod()
{
  int len = -1;
  if (myString != null)
    len = getLength(myString);
}
1 голос
/ 21 июля 2011

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

Другим вариантом является предоставление загрузчика классов-классов и загрузочных классов-имитаторов (и, следовательно, реализаций метода без операций).

В полностью функциональной вселенной вышеизложенное было бы разумным подходом. Учитывая, что это Java, вопрос о том, как вы гарантируете и измеряете побочные эффекты, остается без ответа. Возможно, вышеприведенное сработает для вашего конкретного случая, но для общего случая вы фактически запрашиваете статический анализ байт-кодов Java, и это, вероятно, сама по себе область исследования.

1 голос
/ 21 июля 2011

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

Если вы хотите знать, может ли метод вызвать исключение ;просто не заключайте этот метод в блок try-catch.Редактор, такой как ecliple, будет четко показывать ошибку компиляции, если метод выдает исключение.

Это то, что вы хотите;или я неправильно понял ваш вопрос.

0 голосов
/ 21 июля 2011

Создать тест jUnit

http://www.junit.org/

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