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

时间:2019-10-06 15:07:48

标签: java spring-boot mockito spring-test

我有一个配置类,可使用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 个答案:

答案 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(因为它应该从模拟的组件中清除应用程序上下文),但是库的加载只发生一次。