我需要编写一个模拟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()
方法不是您的选择吗?