我们可以用powermock创建java.lang.class的模拟示例吗?

vc9ivgsu  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(484)

我需要编写一个模拟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:
我也尝试了这个链接的建议

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的模拟示例
谢谢您

pxy2qtax

pxy2qtax1#

根据这份声明,
...
在java.lang.reflect.constructor.newinstance(constructor。java:526)
...
powermock(使用objenesis库)尝试示例化 java.lang.Class ,只能由jvm示例化。来自文档:
类没有公共构造函数。相反,类对象是由java虚拟机在装入类时自动构造的,并通过调用类装入器中的defineclass方法来构造。
很快,我几乎可以肯定,这是不可能的例子 java.lang.Class 手动。如果我错了,请纠正我。
顺便说一句,
很遗憾,我需要更改getclass()的返回值
不是嘲笑吗 getClass() 你有选择吗?

ukdjmx9f

ukdjmx9f2#

确定要模拟类对象吗?有没有一个具体的原因,为什么你不能只做以下?

public class MyTest {
   public static class TestClass {
       public void doFoo() {}
   }

   @Test
   public void myTest() {
       doStuff(TestClass.class);
   }
}
y53ybaqx

y53ybaqx3#

可以使用javacompiler动态编译源文件,使用urlclassloader加载类示例。
我如何以编程方式编译和示例化java类?

4si2a6ki

4si2a6ki4#

为什么不在运行时加载类呢?

Class<?> cls = Class.forName("org.package.Class");

相关问题