Я пишу junit тест для тестирования BaseClass
метод. В этом методе используются члены суперкласса. Конструктор BaseClass
вызывает super(arg1, arg2)
. В конструкторе super (arg1, arg2) имеется инжектор зависимости, устанавливающий частный член суперкласса. Когда я запускаю тест, поскольку зависимость не установлена, super() выбрасывает исключение . Я хочу высмеять только этот оператор в super(), который устанавливает частный член с инъекцией зависимости. Как сделать с mockito?mocking/spying частный член суперкласса
ответ
Инъекция поля всегда является проблемой для тестирования. Поэтому всякий раз, когда у вас есть выбор, выберите вместо него инъекцию конструктора.
Вы можете запустить инжектор зависимости и заставить его вводить макет вместо реального класса. Решения будут зависеть от структуры DI, которую вы используете на самом деле (guice, cdi, ...). Для guice вы можете использовать jukito, например, для cdi Arquillian. Но это замедляет выполнение теста и добавляет сложности вашему тестовому классу.
В качестве альтернативы вы можете отобразить частное поле на экземпляре вашего тестового класса, просто установив макет. Что-то вроде:
instance = new TestObject();
Field injected = TestObject.class.getDeclaredField("injected");
injected.setAccessible(true);
injected.set(instance, mock(InjectedType.class));
в то время как TestObject
класса, который вы хотите проверить, injected
частного поля, где-то инъекция InjectedType
типа этого частного поля.
спасибо @Andreas_D, но проблема в том, что частный член суперкласса получает установленный в его конструкторе. Поэтому мой код генерирует исключение здесь: 'instance = new TestObject();' – vikas