编程语言
首页 > 编程语言> > java-JUnit和Powermock:本机库已在另一个类加载器中加载

java-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,这应该可以帮助您克服此问题.下面的链接中的“抑制静态初始化器”部分提供了一个有关如何执行此操作的好示例:

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")

标签:intellij-idea,junit,dll,powermock,java
来源: https://codeday.me/bug/20191118/2026548.html