Size: a a a

2020 November 16

NG

Nikita Gryzlov in pro.jvm
Бородатый Таракан
В спринге как-то можно протестить через рефлексию private методы?
Method myMethod = ClassImpl.class.getDeclaredMethod("myMethod",
       String.class, String.class, String.class, Tariff.class);
myMethod.setAccessible(true);
boolean output =
       (boolean) myMethod.invoke(validator, "a", "b", "c", tariff);

Где validator это
@Autowired
private MyValidatorInterface validator;

Проблема в том что (внезапно) на invoke говорится что это не его метод - логично потому что у интерфейса есть только его методы
А у имплентации они + private. Как поступить дальше чет хз. Только ради бога - я знаю что тестить private методы это очень плохо и за такое надо бить по рукам, но лучше скажите как протетстить, спасибою
может вместо ClassImpl.class взять класс прямо у валидатора, через validator.getClass()?
источник

БТ

Бородатый Таракан... in pro.jvm
Nikita Gryzlov
может вместо ClassImpl.class взять класс прямо у валидатора, через validator.getClass()?
Либо лыжи не едут, либо я дурак
Но вышла (внезапно) com.sun.proxy.$Proxy248
источник

NG

Nikita Gryzlov in pro.jvm
Бородатый Таракан
Либо лыжи не едут, либо я дурак
Но вышла (внезапно) com.sun.proxy.$Proxy248
ах да, про прокси-то я не подумал
источник

БТ

Бородатый Таракан... in pro.jvm
Nikita Gryzlov
ах да, про прокси-то я не подумал
Мне еще предлагали с метода снять private и оставить package + добавить @VisibleForTesting, но что-то метод все равно не видно в тесте
источник

AG

Alexey Genus in pro.jvm
Бородатый Таракан
В спринге как-то можно протестить через рефлексию private методы?
Method myMethod = ClassImpl.class.getDeclaredMethod("myMethod",
       String.class, String.class, String.class, Tariff.class);
myMethod.setAccessible(true);
boolean output =
       (boolean) myMethod.invoke(validator, "a", "b", "c", tariff);

Где validator это
@Autowired
private MyValidatorInterface validator;

Проблема в том что (внезапно) на invoke говорится что это не его метод - логично потому что у интерфейса есть только его методы
А у имплентации они + private. Как поступить дальше чет хз. Только ради бога - я знаю что тестить private методы это очень плохо и за такое надо бить по рукам, но лучше скажите как протетстить, спасибою
Оставляя за скобками приватность методов, почему бы не взять метод у интерфейса MyValidatorInterface?
источник

NG

Nikita Gryzlov in pro.jvm
Бородатый Таракан
Мне еще предлагали с метода снять private и оставить package + добавить @VisibleForTesting, но что-то метод все равно не видно в тесте
в порядке бреда можно еще переключить создание бина с proxy на cglib. тогда в классе все еще будет какая-то хрень, но по крайней мере это будет наследник вашей имплементации, а не враппер. но делать так стоит только в тест-конфиге, прод может пострадать от внезапного непротестированного переключения
источник

БТ

Бородатый Таракан... in pro.jvm
Alexey Genus
Оставляя за скобками приватность методов, почему бы не взять метод у интерфейса MyValidatorInterface?
Потому что в таком случаем мы получим ровно те методы что объявлены в интерфейсы
Private же метод есть только в классе реализации этого интерфейса
источник

AG

Alexey Genus in pro.jvm
А, точно, всё понял
источник

AG

Alexey Genus in pro.jvm
Может быть, можно этот объект без спринга создать?
Действительно, можно ещё попробовать, переключиться на cglib, там должно рботать
источник

IZ

Ivan Zemlyankiy in pro.jvm
Бородатый Таракан
В спринге как-то можно протестить через рефлексию private методы?
Method myMethod = ClassImpl.class.getDeclaredMethod("myMethod",
       String.class, String.class, String.class, Tariff.class);
myMethod.setAccessible(true);
boolean output =
       (boolean) myMethod.invoke(validator, "a", "b", "c", tariff);

Где validator это
@Autowired
private MyValidatorInterface validator;

Проблема в том что (внезапно) на invoke говорится что это не его метод - логично потому что у интерфейса есть только его методы
А у имплентации они + private. Как поступить дальше чет хз. Только ради бога - я знаю что тестить private методы это очень плохо и за такое надо бить по рукам, но лучше скажите как протетстить, спасибою
я не помню точно, но есть вероятность, что если инжектить через конструктор, то там будет другое поведение
источник

IZ

Ivan Zemlyankiy in pro.jvm
в смысле без прокси
источник

A

Artjom Kalita in pro.jvm
Бородатый Таракан
В спринге как-то можно протестить через рефлексию private методы?
Method myMethod = ClassImpl.class.getDeclaredMethod("myMethod",
       String.class, String.class, String.class, Tariff.class);
myMethod.setAccessible(true);
boolean output =
       (boolean) myMethod.invoke(validator, "a", "b", "c", tariff);

Где validator это
@Autowired
private MyValidatorInterface validator;

Проблема в том что (внезапно) на invoke говорится что это не его метод - логично потому что у интерфейса есть только его методы
А у имплентации они + private. Как поступить дальше чет хз. Только ради бога - я знаю что тестить private методы это очень плохо и за такое надо бить по рукам, но лучше скажите как протетстить, спасибою
а зачем тестировать приватные методы ?
источник

A

Artjom Kalita in pro.jvm
что-то с дизайном приложения очень хуево пошло
источник

 P

 ‌‌Gleb Pilipets... in pro.jvm
А есть какая-то простая DB для джава, где не нужно создавать руками что-либо(запускать сервер, создавать бд и т.д.) - то есть всё внутри проекта создаётся?

Например, в Golang я использовал sqlite драйвер и просто создался файлик .db.
источник

NG

Nikita Gryzlov in pro.jvm
 ‌‌Gleb Pilipets
А есть какая-то простая DB для джава, где не нужно создавать руками что-либо(запускать сервер, создавать бд и т.д.) - то есть всё внутри проекта создаётся?

Например, в Golang я использовал sqlite драйвер и просто создался файлик .db.
можете взять тот же sqlite или h2
источник

 P

 ‌‌Gleb Pilipets... in pro.jvm
Nikita Gryzlov
можете взять тот же sqlite или h2
а для них не нужно создавать бд отдельно от проекта?
источник

V

Vlad in pro.jvm
 ‌‌Gleb Pilipets
А есть какая-то простая DB для джава, где не нужно создавать руками что-либо(запускать сервер, создавать бд и т.д.) - то есть всё внутри проекта создаётся?

Например, в Golang я использовал sqlite драйвер и просто создался файлик .db.
H2, hsqldb, они умеют прям в inmemory режиме работать
источник

ДК

Дмитрий Карманов... in pro.jvm
 ‌‌Gleb Pilipets
А есть какая-то простая DB для джава, где не нужно создавать руками что-либо(запускать сервер, создавать бд и т.д.) - то есть всё внутри проекта создаётся?

Например, в Golang я использовал sqlite драйвер и просто создался файлик .db.
h2 и hsql могут также и в режиме хранения в ФС работать, если нужно как в sqlite
источник

DW

Denis Wargasmer in pro.jvm
Всем хэллоу!у кого есть опыт в решении задач NLP на java. Был бы признателен за консультацию.
источник

 P

 ‌‌Gleb Pilipets... in pro.jvm
Denis Wargasmer
Всем хэллоу!у кого есть опыт в решении задач NLP на java. Был бы признателен за консультацию.
А почему бы не вызвать python script из Java?
источник