我有一个配置类,可使用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两次加载我的库?
答案 0 :(得分:0)
尝试延迟加载,以便仅在真正需要时(即,在调用其某些方法之前)有效地加载该库。
1)根据逻辑的复杂性,将bean定义为@Lazy可以有所帮助。
2)如果您的情况并非如此,则手动执行延迟加载会有所帮助。例如。您可以使用仅在第一次调用库的一种方法时才加载库的代理。
3)可能需要对应用程序的逻辑进行一些修改,才能推迟使用加载库的代码。
答案 1 :(得分:0)
我不是使用NativeLoader.loadLibrary("my-lib")
插入Spring的生命周期挂钩中,而是使用静态上下文。
static {
try {
NativeLoader.loadLibrary("my-lib")
} catch (IOException ex) {
throw new ExceptionInInitializerError(ex);
}
}
主要是使用ExceptionInInitializerError
,它是为这种静态上下文初始化而构建的。
因此,在使用@MockBean
时,spring确实会在每个测试中运行@PostConstruct
(因为它应该从模拟的组件中清除应用程序上下文),但是库的加载只发生一次。