Junit 无法删除最终类的修饰符

Junit 无法删除最终类的修饰符,junit,Junit,我想删除1类的最后一个关键字。我正在为这个类编写Junit,并调用Mockito的spy来模拟一个方法,以返回一个包含所有情况的expect值 使用后: CtClass ctClazz = ClassPool.getDefault().get(Livre.class.getName()); ctClazz.setModifiers(ctClazz.getModifiers() & ~Modifier.FINAL); ctClazz.writeFile(); 这个类的修饰符是17,但我认

我想删除1类的最后一个关键字。我正在为这个类编写Junit,并调用Mockito的spy来模拟一个方法,以返回一个包含所有情况的expect值

使用后:

CtClass ctClazz = ClassPool.getDefault().get(Livre.class.getName());
ctClazz.setModifiers(ctClazz.getModifiers() & ~Modifier.FINAL);
ctClazz.writeFile();
这个类的修饰符是17,但我认为应该是1(public)

我得到了一个错误:

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
最后一个类是从抽象类扩展而来的


谢谢您的帮助。

您不能扩展(子类)一个
final
类。如果您真的需要这样做(无论是为了测试还是因为您真的需要重写其他人库中的方法),那么您必须“fork”该类。将其内容复制到一个新类中(更新包声明和类引用),并删除那里的
final
名称。然后,你可以扩展到你的心的内容。我最近在Spring安全性方面非常有效地使用了这种方法。

我的意思是这个类从抽象类扩展而来。它是一个子类。我知道,Junit实际上是在扩展它(如果我没记错的话,通过代理),这就是引发异常的原因。复制('fork')类,将调用指向fork版本,并正确运行测试。您能给我一个示例吗?对不起,我不太明白你的意思,现在我明白了。你们的意思是我应该把这个类复制到另一个类,删除最后的修饰符,并为新类编写测试用例?阶级的逻辑还保留着吗?