2016-08-23 17 views
4

Я недавно начал работать над TDD для exisitng проекта и столкнулся несколько вопросов, один из тех, кто упомянут нижеMocking/гася частные переменные класса без получения и установки методов

У меня есть собственная переменная поругаем в тестовый класс и переменная выглядит, как показано ниже

private Class<XYZ> cls = XYZ.class; 

позже эта переменная «ЦБС» используется как arugment для одного метода, как Classname

private List create(Class className, Object objectTO, List<String> names) 

I знаю, частные переменные могут быть издевались и я издевался приватную переменную в тестовом случае, выполнив приведенные ниже пункты

  1. Заявленный java.lang.reflect.Field;
  2. Field field = PowerMockito.field(XYZ.class,"cls");
  3. field.set(XYZ.class, "objectOfXYZClass");

Когда я запускаю мой тестовый класс , я становлюсь ниже ошибки

java.lang.IllegalArgumentException: Can not set java.lang.Class field com.tools.XYZ.cls to java.lang.Class 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75) 
at java.lang.reflect.Field.set(Field.java:680) 

Пожалуйста, кто-нибудь может помочь мне в этом и сообщить мне, чего я не вижу.

PS: Я использовал @preparefortest и отметил все необходимые классы в том, что и работает мой тестовый класс с помощью @runwith(powermockrunner.class)

ответ

1
field.set(instanceOfClassXYZ, "") 

Введена в наборе, экземпляр класса. Не класс. Потому что вы устанавливаете строку «objectOfXYZClass» в объект. Не в классе класса;) И я хотел бы добавить

field.setAccessible(true); 
+0

@ Sarseth..yes, который работал на меня .. очень плохо, подал .set(), я делал по-другому ... большое спасибо. –

2

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

Юнит-тесты должны, как правило, делают только следующие вещи:

  1. Вы создаете объект своего «класса испытываемый»
  2. Вы называете общественные методы этого объекта; и вы «утверждаете» результаты на эти вызовы (например, чтобы ожидать определенных исключений здесь или там).

Другими словами: вы очень хотите только тест на внешне видимого поведения вашего «класса испытуемый». И вы знаете: если у вашего класса нет внешне видимого поведения - почему у вас есть, чем в первую очередь ?!

Конечно, иногда это не «достаточно хорошо». В таких случаях, что вы обычно делаете, вы превращаетесь в какую-то насмешливую фреймворк (например, EasyMock или Mockito), чтобы создать , издеваясь над объектами. Вы используете эти макеты при создании экземпляра тестируемого класса (так называемый инъекции зависимостей). Поступая таким образом, вы получаете полный контроль над тестируемым классом; например, вы можете проверить, что ваши mocks видят эти вызовы методов, которые вы ожидаете.

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

И наконец: тесты единиц измерения - это навык, который необходимо изучить. Один из лучших ресурсов для их получения - это videos.