java - JUnit 和 Powermock : Native Library already loaded in another classloader

标签 java intellij-idea dll junit powermock

我有一些测试类需要验证是否调用了 GLFW 函数。但是当我想在 IntelliJ 中执行所有测试时,我得到了错误:

Native Library lwjgl.dll already loaded in another classloader

我使用 Powermock 来验证是否调用了静态方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest({GLFW.class})
public class GlfwWindowImplTest {
    // ...
    @Test
    public void update_swapsBufferAndPollsEvents() {
        GlfwWindowImpl target = new GlfwWindowImpl(1L);
        mockStatic(GLFW.class);

        target.update();

        verifyStatic();
        GLFW.glfwSwapBuffers(1L);
        verifyStatic();
        GLFW.glfwPollEvents();
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest({GLFW.class})
public class GlfwWindowSystemImplTest {
    // ...
    @Test(expected = GlfwInitializeException.class)
    public void initialize_throwsExceptionIfGlfwInitFails() {
        GlfwWindowSystemImpl target = new GlfwWindowSystemImpl();
        mockStatic(GLFW.class);
        when(GLFW.glfwInit()).thenReturn(GL_FALSE);

        target.initialize();
    }
}

最佳答案

回答这篇文章可能有点晚,但我遇到了类似的问题,我能够用 PowerMock 解决它。 PowerMock 有 @SuppressStaticInitializationFor 可以帮助您解决这个问题。下面链接中的 Suppress static initializer 部分有一个很好的例子来说明如何做到这一点:

https://github.com/powermock/powermock/wiki/Suppress-Unwanted-Behavior

基本上,在您的情况下,可能有一个类正在调用 System.loadLibrary("lwjgl")。您需要找到该类。示例:

public class SomeClass {
    ...
    static {
        System.loadLibrary ("lwjgl");
    }
    ...
}

然后在您的测试类中使用 @SuppressStaticInitializationFor 和类的完全限定名称:

@SuppressStaticInitializationFor("com.example.SomeClass")

如果执行 loadLibrary 调用的类是内部类,则需要添加 $InnerClass 以完全限定内部类。示例:

public class SomeClass {
    ...
    public static class SomeInnerClass {
        static {
            System.loadLibrary ("lwjgl");
        }
    }
    ...
}

那么你需要使用:

@SuppressStaticInitializationFor("com.example.SomeClass$SomeInnerClass")

关于java - JUnit 和 Powermock : Native Library already loaded in another classloader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39248363/

相关文章:

java - Play Framework 无法运行现有项目

intellij-idea - 您可以增加 IntelliJ IDEA 中的粘贴缓冲区大小吗

windows - 了解对 dll 文件的注册表数据引用的负偏移量

multithreading - Synchronize() 挂起线程

java - Spring、Hibernate、事务管理、未提交

java - 只能为 HMAC 签名指定 key 字节。请指定一个 PublicKey 或 PrivateKey 实例

java - 查看 IDEA 13 Gradle 依赖

c - 使用 FTD2XX C++ 的 QtCreator undefined reference

java - 通用数据记录无法转换为 Avro

intellij-idea - 以编程方式创建 IntelliJ 模块