为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2023-09-27 17:28:24
我有一个使用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 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

我没有NativeLoader.loadLibrary("my-lib")使用 spring 的生命周期钩子,而是使用静态上下文。


static {

    try {

        NativeLoader.loadLibrary("my-lib")

    } catch (IOException ex) {

        throw new ExceptionInInitializerError(ex);

    }

}

最主要的是使用ExceptionInInitializerError它是为这种静态上下文初始化而构建的。


因此,当使用时@MockBean,spring 确实在每个测试中运行@PostConstruct(因为它应该清除模拟组件中的应用程序上下文),但库的加载只发生一次。


查看完整回答
反对 回复 2023-09-27
?
温温酱

TA贡献1752条经验 获得超4个赞

尝试延迟加载,以便仅在真正需要时(即在调用其某些方法之前)才有效加载库。

1)根据逻辑的复杂性,将 bean 定义为 @Lazy 可以提供帮助。

2)如果这不是你的情况,手动实现延迟加载会有所帮助。例如,您可以使用代理,仅在第一次调用其中一个方法时才加载库。

3) 可能需要对应用程序的逻辑进行一些修改,以推迟加载库的代码的使用。


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信