Статья подготовлена для студентов курса «Java QA Automation Engineer» в образовательном проекте OTUS.
Главная идея паттерна proxy (в русскоязычных изданиях его называют «заместитель») состоит в том, чтобы выдать для работы не реальный объект, а подмену, которая использует методы объекта и нашу логику, если мы такую добавили.
Как это делается
1) Создаём интерфейс с публичными методами объекта, который хотим подменить.
2) Создаём класс, который:
— реализует этот интерфейс;
— имеет доступ к оригинальному объекту, чтобы вызывать его методы.
3) Добавляем в методы созданного класса свою логику.
Практика
На практике должно быть понятней.
Дано: есть у нас WebDriver. И есть у него метод findElements(By by);
Задача: мне очень сильно нужно логировать, сколько элементов было найдено по селектору.
Каждый раз, когда я вызываю метод:
я хочу видеть в логах запись — сколько элементов было найдено.
Решение 1. В лоб
Чего уж там: я его применял. Просто берём и при каждом вызове пишем, сколько было найдено:
Вариант нормальный, пока таких вызовов, ну, скажем, 7. Хотя уже неприятно и минусы такого подхода очевидны любому, кто хоть раз «слегка модифицировал свой код».
Решение 2. Используем прокси
WebDriver — интерфейс. Объявлены методы, но нет реализации. Реализацию содержат ChromeWebDriver, FirefoxWebDriver и т. д. Нам, в тестах, не обязательно работать с каким-то конкретным классом для хрома или сафари. Нужно только, чтобы класс имплементил интерфейс WebDriver. Это и сделаем.
Создаём интерфейс с публичными методами объекта, который хотим подменить. В нашем примере такой интерфейс уже есть — WebDriver. Создаём класс, который:
— реализует этот интерфейс;
— имеет доступ к оригинальному объекту, чтобы вызывать его методы.
Добавляем в методы созданного класса свою логику:
Что произошло?
В класс добавлен:
Это тот самый объект, который мы хотим подменить. Именно его методы мы будем вызывать дальше. Теперь, можно посмотреть, например, на метод:
Всё, что делает метод, — вызывает get() у настоящего драйвера. А вот метод:
Мы расширили в соответствии с нашей задачей. Вот и всё, можно юзать в тестах:
Паттерн хорош, если нужно навесить логирование, кэширование, ленивую инициализацию, контроль доступа к методам. В общем, если вы пишете код и вам очень хочется, чтобы была какая-то прослоечка с вашими фичами, один из вариантов — прокси.
Теперь, когда мы знаем на один паттерн больше, напомню, что когда в руке молоток, всё вокруг кажется гвоздями. Просто помните об этом.
Набор студентов на курс «Java QA Automation Engineer» уже открыт, не пропустите!
ВСТУПИТЕЛЬНОЕ ТЕСТИРОВАНИЕ