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