Spring 使用 MockBean 清除上下文缓存失败 loadLibrary

Spring Context cache clean with MockBean fails loadLibrary

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

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

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

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

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

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

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

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

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