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
(因为它应该从模拟组件中清除应用程序上下文),但是加载图书馆发生一次。
我有一个配置 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
(因为它应该从模拟组件中清除应用程序上下文),但是加载图书馆发生一次。