Лучшая практика для неверных параметров метода удаления - PullRequest
3 голосов
/ 08 апреля 2009

Итак, у меня есть абстрактный тип данных с именем RegionModel с серией значений (Region), каждое из которых сопоставлено с индексом. Можно удалить несколько регионов, позвонив по номеру:

regionModel.removeRegions(index, numberOfRegionsToRemove);

Мой вопрос: как лучше всего обрабатывать вызов, когда индекс действителен:

(от 0 (включительно) до количества регионов в модели (исключая))

но числоOfRegionsToRemove недопустимо:

(index + regionToRemove> количество регионов в модели)

Лучше ли бросить исключение, такое как IllegalArgumentException, или просто удалить столько областей, сколько я могу (все области от индекса до конца модели)?

Подвопрос: Если я выброшу исключение, каков рекомендуемый способ модульного тестирования, чтобы вызов вызвал исключение и оставил модель нетронутой (здесь я использую Java и JUnit, но я думаю, это специфический вопрос Java).

Ответы [ 3 ]

2 голосов
/ 08 апреля 2009

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

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

1 голос
/ 08 апреля 2009

Я согласен с Митчелом и casperOne - исключение имеет смысл.

Что касается модульного тестирования, JUnit4 позволяет вам напрямую делать исключения: http://www.ibm.com/developerworks/java/library/j-junit4.html

Вам потребуется только передать параметры, которые гарантированно вызывают исключение, и добавить правильную аннотацию (@Test(expected=IllegalArgumentException.class)) в метод теста JUnit.

Редактировать : Как упоминал Том Мартин, JUnit 4 - это шаг в приличном размере от JUnit 3. Однако можно также тестировать исключения с помощью JUnit 3. Это не так просто. 1011 *

Один из способов проверки исключений - использование блока try/catch внутри самого класса и встраивание в него операторов Assert.

Вот простой пример - он не завершен (например, предполагается, что instanceModel создан), но он должен дать представление:

public void testRemoveRegionsInvalidInputs() {
  int originalSize = regionModel.length();
  int index = 0;
  int numberOfRegionsToRemove = 1,000; // > than regionModel's current size
  try {
    regionModel.removeRegions(index, numberOfRegionsToRemove);

    // Since the exception will immediately go into the 'catch' block this code will only run if the IllegalArgumentException wasn't thrown
    Assert.assertTrue("Exception not Thrown!", false);
  }
  catch (IllegalArgumentException e) {
     Assert.assertTrue("Exception thrown, but regionModel was modified", regionModel.length() == originalSize);
  }
  catch (Exception e) {
      Assert.assertTrue("Incorrect exception thrown", false);
  }
}
1 голос
/ 08 апреля 2009

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

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