Можно ли из нестатического метода обратиться к статическим членам и наоборот в Java
Что проверяют
Понимаете ли вы, кому принадлежит член класса: самому классу или конкретному объекту. Автоматизатору это нужно на практике, потому что статические поля в тестах чаще всего и приводят к нестабильным прогонам. Следом спрашивают, почему статический метод не видит поле экземпляра и что будет со static WebDriver при параллельном запуске.
Как отвечать
Из нестатического метода к статическим членам обращаться можно всегда. Статическое поле существует в одном экземпляре на класс (точнее, на класс в конкретном загрузчике), и любой объект его видит. Писать лучше через имя класса, Config.BASE_URL, чтобы было видно, что поле общее.
Наоборот напрямую нельзя. У статического метода нет this, он не знает, о каком объекте речь, и компилятор ответит non-static variable cannot be referenced from a static context. Обойти можно только явно: создать объект или получить его параметром и обратиться через ссылку, например page.open().
Что стоит добавить:
- статический вызов через объект:
obj.staticMethod()компилируется, но метод выбирается по объявленному типу переменной, а не по реальному объекту. Статические методы не переопределяются, а скрываются; - вложенные классы:
static-вложенный класс не держит ссылку на внешний объект, а обычный внутренний держит и без неё не создаётся; - JUnit: в JUnit Jupiter по умолчанию на каждый тест создаётся новый экземпляр класса, поэтому поля экземпляра сбрасываются, а статические живут весь прогон. Отсюда и требование, чтобы
@BeforeAllбылstatic, если не включён@TestInstance(Lifecycle.PER_CLASS).
Где спотыкаются
Держат драйвер в static WebDriver driver. В последовательном прогоне это работает, а при параллельном два теста управляют одним браузером. Для параллельного запуска драйвер хранят в ThreadLocal<WebDriver> или передают через экземпляр.
Говорят, что статический метод «вообще не может» работать с полями объекта. Может, через ссылку на объект, нельзя только неявно.
Складывают состояние теста в статические поля и забывают его чистить. Один тест оставил там данные, следующий на них опирается, и падение начинает зависеть от порядка запуска.