...but didn't succeed on the first attempt due to it's illogical complexity :(
So I did this sandbox. And you know what? This seems to work without any DI container :)
... но с первого раза это не вышло, изза странной необычной архитектуры исходного приложения. "В лоб" поменять @Inject'ы на @Autowired не вышло, а постоянные попытки автора инжектить контекст и доставать из него синглетоны руками (особенно в абстрактном классе) меня добили.
Но задачка всё же интересная, поэтому написал этот сэндбокc
Конфиг с ObjectMapper'ом и @ComponentScan, на все бины @Component, инжекшены пусть пока будут field. Работает!
Прежде чем писать остальные классы, надо реализовать ноды. чтобы приятнее было тестировать, а не писать jsonы для всех объектов вручную %) Чтобы тестировать Node надо написать поддержку Page и CreatePage (классов становится многовато, заведем папки methods и objects)
от сервевра ответ на createPage приходит в таком формате:
{"ok":true,"result":{"path":"My-title-07-21-4","url":"https:\/\/telegra.ph\/My-title-07-21-4","title":"My title","description":"","author_name":"Random author","content":["My content"],"views":0,"can_edit":true}}
Пока что для простоты мы не подерживаем статус результата, поэтому в мок-ответ в Executor'e запишем просто содержимое result.
Все раюобтает, единственнное что надо поменять названия JsonProperty, т.к. с сервера приходят "_" вместо кэмелКейса Еще у нас есть опшонал проперти, добавим @JsonIgnoreProperties(ignoreUnknown = true) над TelegraphObject вот вопрос,нвдо ли Node делать impplements TelegraphObject? в оригинале так и есть, непонятно пок зачем, пока что оставим
Итак, теперь надо сделать поддержку статусов ответа, создаем TelegraphResponse, параметризованный объектами телеграфа В нем поля Boolean ok, String error и собственно T result, помеченнные @JsonProperty Ну и теперь вреализации каждого Method'a надо что-то поменять, чтобы поолучать TegraphResponse Попробуем просто зассунуть в TypeReference<...>, по идее должно работать. передастся в тип поля result, и Jackson будет искать в ответе его поля. Еще надо в каждом инстансе "Метода" изменить возвращаемое значение на getResult() в случае если getOk=true Вуаля, работает!
Осталось написать все остальные методы. Либо - мы ужеоченьблизко приблизились к оригинальной библиотеке, можно было бы просто на нее навесить Спринговый котекст, но....
Этот странный патттерн проектирования - "Команда", если я не ошибаюсь... - так вот. Как в нём что-либо тестировать? Я хочу написать простой понятный тест - на что мне его писать - на execute(), что ли? Ну тогда скорее уж на deserializeResponse, но он вызывается скрытымобразом от нашего апи , не торчит наружу. Так тестировать,и вообще проектировать, нехорошо... Может стоит переписать библиотеку на другой паттерн?