我想模拟一个继承的子类方法。由于它是最终的,因此不能超越。当使用"何时,theReturn" Mockito在调用导致某些例外的真实方法,并且想避免。
class A{
final String doSomething()
{
//Some treatement
return "";
}
}
class B extends A{
//
}
class TestB {
@Test
public void test(){}
B b=mock(B.class);
when(B.doSomething()).thenReturn("");// it fails because it calls //the real method of A
}
}
有两个原因为什么可以问这个问题:
a)您正在处理某种无法更改的第三方库/设计;但是您想以某种方式进行测试。在这种情况下,使用PowerMock可以选择,因为PowerMock操纵字节代码并可以模拟最终方法/类。但是:PowerMock以创造各种怪异的问题而闻名;认真的:您不使用它会更好。
b)您遇到"单元测试"错误:您从不B中的代码需要做某事。
因此,您的真正问题是:您想测试的B上有一些方法" Dosomethingelse()"。和" Dosomethingelse()"调用" Dosomething()" ...并且您的测试失败,因为您无法控制" Dosomething()"的行为。有两个选择可以解决这个问题:
1)您真的需要继承吗?B必须真正扩展A,或者如果B对象...仅拥有A对象会更好?(如果是这样,您可以模拟该对象并获得对其方法的控制)。听说过COI?
2)您反向依赖性;喜欢:
abstract class A {
final void doSomething() { doSomethingSpecific() ... }
abstract void doSomethingSpecific();
}
class B extends A { @Override void doSomethingSpecific() { ...
为您的"测试"问题产生"正确的OO"解决方案。
此外:如果" Dosomething()"是A类最终strong>不更改。因此,您可以回到您的设计,也许添加了"出于错误的原因"添加了最终,那么简单地删除关键字可能就可以了。