通过反射或其他方式覆盖Java final方法?
问题内容:
尝试编写测试用例时会出现此问题。Foo是框架库中的类,我没有源访问权限。
public class Foo{
public final Object getX(){
...
}
}
我的申请将
public class Bar extends Foo{
public int process(){
Object value = getX();
...
}
}
由于其他依赖关系,我无法创建Foo对象,因此单元测试用例无法初始化。BarTest会抛出一个null指针,因为value为null。
public class BarTest extends TestCase{
public testProcess(){
Bar bar = new Bar();
int result = bar.process();
...
}
}
有没有一种方法可以使用反射API将getX()设置为非最终值?或者我应该如何进行测试?
问题答案:
您可以创建另一个可以在测试中覆盖的方法:
public class Bar extends Foo {
protected Object doGetX() {
return getX();
}
public int process(){
Object value = doGetX();
...
}
}
然后,您可以在BarTest中覆盖doGetX。