gpt4 book ai didi

java - 我们可以用 PowerMock 创建一个模拟的 java.lang.Class 实例吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:19 26 4
gpt4 key购买 nike

我需要编写一个模拟 java.lang.Class 类实例的测试。这可以通过 PowerMock 实现吗?

我尝试执行以下操作:

PowerMock.createMock(Class.class);

结果是:

java.lang.IllegalAccessError: java.lang.Class
at sun.reflect.GeneratedSerializationConstructorAccessor12.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
at org.powermock.reflect.internal.WhiteboxImpl.newInstance(WhiteboxImpl.java:223)
at org.powermock.reflect.Whitebox.newInstance(Whitebox.java:139)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2146)
at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:89)

根据 PowerMock 的文档,这应该是可能的,但我仍然收到此错误。

有人设法做到这一点吗?

编辑:为什么我需要这个?在测试的代码中有以下语句:

if (someObject.getClass().getName().equals(SOME_CLASS_NAME_THAT_I_DONT_HAVE_ACCESS_TO)) { ... do some stuff ... }

我需要我的测试才能到达“if”内的编码,但我什至无法提供具有相应名称的类的模拟实例。

作为解决方法,我可以在测试中创建一个具有相同名称和包的类,但它很难看。

编辑2:

我也尝试了来自 this link 的建议

import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.Test;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Test1.class})
public class Test1 {

@Test
public void test() {
PowerMock.createMock(Class.class);
}

}

结果是一样的:“java.lang.IllegalAccessError: java.lang.Class”

因此作为最终结果 - 似乎没有办法创建 java.lang.Class 的模拟实例

谢谢

最佳答案

根据这个说法,

...

at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

...

PowerMock(使用 Objenesis 库)尝试实例化 java.lang.Class,它只能由 JVM 实例化。来自 docs :

Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.

很快,我几乎可以肯定不可能手动生成 java.lang.Class 的实例。如果我错了,请纠正我。

顺便说一下,

Unfortunately I need to change the return value of the getClass().getName()

模拟 getClass() 方法不是您的选择吗?

关于java - 我们可以用 PowerMock 创建一个模拟的 java.lang.Class 实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964561/

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