Добрый день!
Есть класс, конструктор которого выглядит так:
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: если проверку в методах решено производить (дублировать в целях отказоустойчивости кода), как тогда протестировать эти методы на выброс соответствующего исключения (ведь конструктор не даст создать "неправильный" объект)?