使用 MockBean 清理 Spring Context 缓存失败 loadLibrary

我有一个使用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 加载我的库两次?


拉丁的传说
浏览 131回答 2
2回答

慕斯709654

我没有NativeLoader.loadLibrary("my-lib")使用 spring 的生命周期钩子,而是使用静态上下文。static {    try {        NativeLoader.loadLibrary("my-lib")    } catch (IOException ex) {        throw new ExceptionInInitializerError(ex);    }}最主要的是使用ExceptionInInitializerError它是为这种静态上下文初始化而构建的。因此,当使用时@MockBean,spring 确实在每个测试中运行@PostConstruct(因为它应该清除模拟组件中的应用程序上下文),但库的加载只发生一次。

温温酱

尝试延迟加载,以便仅在真正需要时(即在调用其某些方法之前)才有效加载库。1)根据逻辑的复杂性,将 bean 定义为 @Lazy 可以提供帮助。2)如果这不是你的情况,手动实现延迟加载会有所帮助。例如,您可以使用代理,仅在第一次调用其中一个方法时才加载库。3) 可能需要对应用程序的逻辑进行一些修改,以推迟加载库的代码的使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java