我想删除1个类的最后一个关键字。我正在为这堂课写Junit,我打电话给Mockito的间谍来模拟一个返回期望值的方法,以涵盖所有案例。
使用后:
CtClass ctClazz = ClassPool.getDefault().get(Livre.class.getName());
ctClazz.setModifiers(ctClazz.getModifiers() & ~Modifier.FINAL);
ctClazz.writeFile();
这个类的修饰符是17,但我认为它应该是1(公共)。
我收到了错误:
Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class mediatheque.document.Livre
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
at org.powermock.api.easymock.internal.signedsupport.SignedSupportingClassProxyFactory.createProxy(SignedSupportingClassProxyFactory.java:147)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:40)
at org.easymock.classextension.internal.MocksClassControl.createMock(MocksClassControl.java:43)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2076)
at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:79)
at org.powermock.api.easymock.PowerMock.createPartialMock(PowerMock.java:765)
at test.mediatheque.document.TestDocument.testRestituer_With_Exception3(TestDocument.java:379)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$2.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:217)
... 19 more
这个最后的类从一个抽象类扩展而来。
感谢您的帮助。
答案 0 :(得分:0)
您无法扩展(子类)final
类。如果你真的需要这样做(无论是用于测试,还是因为你真的需要覆盖别人的库中的方法),你必须“分叉”这个类。将其内容复制到一个新类(更新包声明和类引用),并删除final
指定那里。然后,您可以将其扩展到您的内心。最近我在Spring Security方面非常有效地使用了这种方法。