Ответ 1
Основной принцип модульного тестирования заключается в том, что вы тестируете простой блок кода; то есть каждый метод должен быть проверен по существу.
Это означает, что мы не можем использовать метод get
в нашем тесте set
, и наоборот - вы не тестируете отдельную единицу кода, которая является единственным методом.
Учитывая, что...
Скажем, мы имеем a PlainOldJavaObject
с полем value
, которое мы хотим (по какой-то причине) проверить для обоснованности сеттеров и геттеров. Единственный подходящий способ сделать это - использование отражения.
Здесь мое объявление класса, которое довольно тощее:
public class PlainOldJavaObject {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Теперь я настроил свой тестовый класс, чтобы использовать отражение; специально используя класс Field
:
public class PlainOldJavaObjectTest {
@Test
public void testSetter_setsProperly() throws NoSuchFieldException, IllegalAccessException {
//given
final PlainOldJavaObject pojo = new PlainOldJavaObject();
//when
pojo.setValue("foo");
//then
final Field field = pojo.getClass().getDeclaredField("value");
field.setAccessible(true);
assertEquals("Fields didn't match", field.get(pojo), "foo");
}
@Test
public void testGetter_getsValue() throws NoSuchFieldException, IllegalAccessException {
//given
final PlainOldJavaObject pojo = new PlainOldJavaObject();
final Field field = pojo.getClass().getDeclaredField("value");
field.setAccessible(true);
field.set(pojo, "magic_values");
//when
final String result = pojo.getValue();
//then
assertEquals("field wasn't retrieved properly", result, "magic_values");
}
}
В первом тесте я уверен, что поле считывается путем отражения доступа к значению, содержащемуся в поле для экземпляра PlainOldJavaObject
. Не нарушая целостность объявленного класса *, я уверен, что поле устанавливается соответствующим образом.
Во втором тесте я предполагаю, что значение уже установлено на что-то ранее, поэтому настройка включает в себя заполнение поля известным значением по умолчанию. Когда я прочитаю значение обратно, я утверждаю, что значение, возвращаемое значением, является значением, которое мы знаем, изначально было установлено.
В конечном счете, если у вас много сеттеров и геттеров, вам придется делать такой код (так как, если вы полагаетесь на предположение, что ваши сеттеры и геттеры "просто работают", например, вы находитесь в своих тестах выше, ваши тестовые примеры могут быть недействительными).
*: Имейте в виду, что рефлексия - быстрый и быстрый способ вступить в экстремальные проблемы с поведением undefined, и у вас мало гарантий неизменности объекта. Вы снимаете термоусадочную пленку с языка и делаете странные и необычные вещи. Действуйте на свой страх и риск.