模拟父母最终方法



我想模拟一个继承的子类方法。由于它是最终的,因此不能超越。当使用"何时,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>不更改。因此,您可以回到您的设计,也许添加了"出于错误的原因"添加了最终,那么简单地删除关键字可能就可以了。

相关内容

  • 没有找到相关文章

最新更新