无法删除最终类的修饰符

时间:2013-05-24 00:51:32

标签: junit

我想删除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

这个最后的类从一个抽象类扩展而来。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您无法扩展(子类)final类。如果你真的需要这样做(无论是用于测试,还是因为你真的需要覆盖别人的库中的方法),你必须“分叉”这个类。将其内容复制到一个新类(更新包声明和类引用),并删除final指定那里。然后,您可以将其扩展到您的内心。最近我在Spring Security方面非常有效地使用了这种方法。