2013-07-11 5 views
3

Я пишу junit тест для тестирования BaseClass метод. В этом методе используются члены суперкласса. Конструктор BaseClass вызывает super(arg1, arg2). В конструкторе super (arg1, arg2) имеется инжектор зависимости, устанавливающий частный член суперкласса. Когда я запускаю тест, поскольку зависимость не установлена, super() выбрасывает исключение . Я хочу высмеять только этот оператор в super(), который устанавливает частный член с инъекцией зависимости. Как сделать с mockito?mocking/spying частный член суперкласса

ответ

2

Инъекция поля всегда является проблемой для тестирования. Поэтому всякий раз, когда у вас есть выбор, выберите вместо него инъекцию конструктора.

Вы можете запустить инжектор зависимости и заставить его вводить макет вместо реального класса. Решения будут зависеть от структуры 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 типа этого частного поля.

+0

спасибо @Andreas_D, но проблема в том, что частный член суперкласса получает установленный в его конструкторе. Поэтому мой код генерирует исключение здесь: 'instance = new TestObject();' – vikas