Неожиданное взаимодействие между @Timed и @SneakyThrows

У нас есть проект Spring Boot, который использует Consumer<T> функциональный интерфейс Java для обработки сообщений String как JSON. Поскольку accept() не допускает проверенных исключений, мы аннотируем его с помощью @SneakyThrows (JsonProcessingException.class). Мы включаем тесты, которые проверяют, что ожидаемые исключения генерируются при передаче null и "" (пустая строка). Все отлично работает.

Теперь нам нужно добавить метрики к этому методу. После добавления аннотации @Timed тест, проверявший исключение JsonProcessingException, завершился ошибкой с неожиданным java.lang.reflect.UndeclaredThrowableException.

Меня это удивляет. Аннотация @SneakyThrows обрабатывается во время компиляции, поэтому не следует ли аспекту @Timed просто обернуть этот метод и повторно выбросить исключение JsonProcessingException? Что мы можем сделать, чтобы аннотация @Timed так работала?

Вы можете найти проект на https://github.com/mrgrew/timedsneaky, который демонстрирует проблему.

Это может быть связано с Spring + lombok + @SneakyThrows, но эти решения, похоже, предлагали переписать тесты, которые не кажется правильным.


person mrgrew    schedule 20.10.2020    source источник