Как работает обработка аннотаций в JUnit?
Не понимаю, как фреймворки работают с аннотациями.
Например, JUnit.
В классе у метода пишем @Test и уже можно запускать проект. Причем, без Main метода.
Мне понятно, что есть какой-то обработчик на рефлексии в который инкапсулированна логика.
НО, как при старте приложения фреймворк регистрирует свой обработчик аннотаций? Как JVM понимает, что нужно его использовать?
Ответы (1 шт):
Когда вы запускаете тесты, то вы их не запускаете как обычное java приложение. Вы запускаете либо из IDE либо с помощью плагинов к maven или gradle.
Рассмотрим сначала IDE. Тут используется специальный test runner, т.е. приложение с методом main (которое поставляется вместе с IDE), которое используя сканирование classpath (если запуск идет для всего проекта), либо использует конкретный класс (если тесты запускаются для конкретного класса). test runner с помощью рефлексии ищет методы с аннотацией, создает экземпляры теста и запускает их. Это приложение использует API junit, который позволяет запускать тесты.
Запускается он, когда вы выбираете пункт меню в IDE запустить тесты. Вот как конфигурация запуска тестов выглядит в eclipse:

При нажатии на Run IDE запустит test runner.
Аналогично работают плагины для maven и gradle, во время сборки они используют API junit для запуска test runner-ов.
Т.е JVM нечего не знает. Если реализованные классы test runner-ов, которые занимаются поиском, инстанциированием и запуском тестов.