Очистка кеша Spring Context с помощью MockBean завершается неудачей loadLibrary - PullRequest
1 голос
/ 06 октября 2019

У меня есть класс конфигурации, который загружает библиотеку, используя https://github.com/scijava/native-lib-loader (что здорово).

К сожалению, при использовании @MockBean он вызывает обновление кэша контекста. Я не знаю почему, но я не могу запустить NativeLoader.loadLibrary("my-lib") дважды, поскольку я получаю это FileNotFoundException: The process cannot access the file because it being used by another process во второй раз.

Как я могу сделать так, чтобы конфигурация запускалась один раз во время тестов илиNativeLoader загружает мою библиотеку дважды?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Вместо того, чтобы зацеплять NativeLoader.loadLibrary("my-lib") в крючок пружины жизненного цикла, я использовал статический контекст.

static {
    try {
        NativeLoader.loadLibrary("my-lib")
    } catch (IOException ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

Главное - использовать ExceptionInInitializerError, который построен для этого видастатических инициализаций контекста.

Таким образом, при использовании @MockBean Spring запускает @PostConstruct в каждом тесте (как это должно очищать контекст приложения от проверенных компонентов), но загрузка библиотеки происходит один раз.

0 голосов
/ 06 октября 2019

Попробуйте ленивую загрузку, чтобы библиотека загружалась эффективно только тогда, когда она действительно необходима, то есть непосредственно перед вызовом некоторых из ее методов.

1) В зависимости от сложности вашей логики определение компонента как @Lazyможет помочь.

2) Если это не ваш случай, ручная реализация отложенной загрузки может помочь. Например, вы можете использовать прокси, который будет загружать библиотеку только при первом вызове одного из ее методов.

3) Может потребоваться некоторая переделка логики вашего приложения, чтобы отложить использование кода, загружающегобиблиотека.

...