gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:32 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com