Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   @Autowired и рефлекшн. (http://forums.kuban.ru/f1024/%40autowired_i_reflekshn-8408931.html)

Добрых дел мастер 24.07.2017 22:22

@Autowired и рефлекшн.
 
Есть у меня класс, пишу под него юнит-тест.
У класса есть приватный метод, который я хочу протестировать.
Очевидное решение -
@Autowired
MyClass object;

Method method = object.getClass().getDeclaredMethod(
"myPrivateMethod", param1.class, param2.class ...);

Все бы ничего, но... не работает. Получаю java.lang.NoSuchMethodException.
При этом, я вижу, что эксепшн валится для класса-обертки - MyClass$$EnhancerBySpringCGLIB$$65be72d7


Пробую по-другому.
Method method = Class.forName("com.gmail.dimkrayan.MyClass").getDeclaredMethod(
"myPrivateMethod", param1.class, param2.class ...);
В итоге метод получается, но при попытке его invode получаю
java.lang.reflect.InvocationTargetException

И вот на этом мысль как-то останавливается.
Есть способы получить в autowired-переменной получить исхоодный объект, а не обертку? Или может я не в том направлении думаю и нужно совсем по-другому?

wayerr 25.07.2017 13:31

> но при попытке его invode получаю

ну так первым параметром при invoke передавай инстанс обертки - должно сработать

только вот зачем тебе здесь autowired, и зачем тестировать приватный метод? не говоря уже о том что из-за того что приватные методы не обрабатываются CGLIB то можно огрести фееричных глюков

Добрых дел мастер 25.07.2017 17:08

Так и делаю. Не срабатывает.

Данный класс зависит от большого количества других автосозданных спрингом классов.

А могу я делать автосвязывание без cglib? Понятно, что медленнее, но это же тесты.

wayerr 25.07.2017 18:04

тогда сделай метод хотябы protected ибо

> из-за того что приватные методы не обрабатываются CGLIB то можно огрести фееричных глюков

причем не важно используешь ты cglib или проксирование - один фиг транзакции lazy бины и многие другие могут не работать

Добрых дел мастер 25.07.2017 21:26

> тогда сделай метод хотябы protected ибо
Не могу. Классы не мои. Просто, у нас после какого-то обновления сломалось сразу много тестов. Вот, смотрю. (Не уверен, что именно этот тест сломался вместе со всеми, может просто его автор был не аккуратен)
Да и не спортивно это. Легкий путь.

А можно весь этот lazy для теста отключить?

wayerr 26.07.2017 16:34

>Да и не спортивно это. Легкий путь.

ну ну

>А можно весь этот lazy для теста отключить?

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

Добрых дел мастер 26.07.2017 19:11

посмотрел дебагером, метод вызывается (вторым способом), но внутри вызванного метода все автосвязанные поля класса = null.


Текущее время: 12:04. Часовой пояс GMT +3.