我需要编写一个模拟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的模拟实例。

谢谢

最佳答案

根据这个说法,



PowerMock(使用Objenesis库)尝试实例化java.lang.Class,该代码只能由JVM实例化。从docs:



很快,我几乎可以确定不可能手动创建java.lang.Class实例。如果我错了,请纠正我。

顺便一提,



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

09-12 09:36
查看更多