Задать вопрос
@KaminskyIlya

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

Добрый день!

Есть класс, конструктор которого выглядит так:
public ImageCutter(int width, int height, int sizing)
  {
    if (sizing != SIZE_CUT && sizing != SIZE_COVER && sizing != SIZE_CONTAIN)
      throw new IllegalArgumentException(String.format("Image sizing method = %d not implemented.", sizing));
      ...
  }


Обратите внимание, что допустимые значения для sizing проверяются в конструкторе.
Есть метод, работа которого зависит от sizing:
public ImageCopyRegion getCopyRegion(int imageWidth, int imageHeight)
  {
    switch(sizing)
    {
      case SIZE_CUT:
        return getCuttedImage(imageWidth, imageHeight);

      case SIZE_COVER:
        return getCoveredImage(imageWidth, imageHeight);

      case SIZE_CONTAIN:
        return getContainedImage(imageWidth, imageHeight);
    }
    //TODO: как это протестировать, при условии того, что конструктор обрубил это?
    throw new IllegalStateException(String.format("Image sizing method = %d not implemented", sizing));
  }


Вопрос 1: как написать тест на тот метод так, чтобы проверить выброс IllegalStateException при недопустимых значениях sizing?
Проблема ниже:
@Test(expected = IllegalStateException.class)
public void testGetCopyRegion_ForInvalidSizing_MustExcept()
{
   ImageCutter cutter = new ImageCutter(0, 0, 100); // будет исключение IllegalArgumentException  здесь, а не ниже
   cutter.getCopyRegion(-1, 0); // ожидается исключение здесь
}


P/S
Интересует элегантное решение от опытных тестеров.

P/S
Можно, конечно, вместо "магических констант" использовать enum. Тогда указать недопустимые значения будет невозможно.
Что ж, как вариант. Но все-таки интересует концепция.
Путь у нас есть некоторое поле объекта, диапазон значений которого проверяется в конструкторе.
Вопрос 2: стоит ли проверять это значение в других публичных методах, которые его используют?
Вопрос 3: если проверку в методах решено производить (дублировать в целях отказоустойчивости кода), как тогда протестировать эти методы на выброс соответствующего исключения (ведь конструктор не даст создать "неправильный" объект)?
  • Вопрос задан
  • 109 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы