我有一些测试类需要验证是否调用了 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/