У меня есть аннотация, которую я в настоящее время использую только для внутренней сборки и в целях документации. Он не предлагает никакого значения во время выполнения, поэтому я выбрал @Retention(SOURCE)
:
@Retention(SOURCE)
public @interface X
Однако, чтобы проверить правильность его использования, я хотел бы реализовать модульный тест, который перемещается по всему API, чтобы проверить, применяется ли аннотация везде, где она должна применяться. Этот модульный тест было бы довольно легко реализовать с использованием обычных API-интерфейсов отражения Java, но я не могу этого сделать, поскольку тесты не могут отражать аннотацию, учитывая ее @Retention(SOURCE)
.
Чтобы использовать отражение в тестах, мне нужно изменить его на @Retention(RUNTIME)
, чего я хотел бы избежать из-за перегрузки в байтовом коде во время выполнения.
Обходные пути, о которых я знаю:
Есть обходные пути, как всегда. Я знаю об этом:
- Мы могли бы использовать процессор аннотаций, который не проходит сборку, вместо выполнения модульных тестов. Это выполнимо, но менее оптимально, поскольку тесты довольно сложны и их гораздо сложнее реализовать с использованием процессоров аннотаций, а не модульных тестов с использованием API-интерфейсов junit и более удобного API-интерфейса отражения. Я хотел бы использовать этот обходной путь только в качестве крайней меры.
- Мы могли бы изменить
@Retention
на RUNTIME
в наших источниках, создать источники с помощью этих дополнительных тестов, затем предварительно обработать API, чтобы снова удалить сохранение, а затем собрать API во второй раз для производственного использования. Это досадный обходной путь, поскольку он усложнит и замедлит сборку.
Вопрос:
Есть ли более удобный способ сохранить аннотацию во время выполнения только для тестов, но не в фактически созданном jar-файле, используя Maven?