我有一个子类扩展抽象类名为AbstractParentClass像
class Child extends AbstractParentClass
这个AbstractParentClass包含一个叫做getParentAbstractServiceMethod
的方法,它返回一些服务类对象。这个服务类有另一个叫做getParentAbstractClassDomainFacade
的方法,它返回一些非抽象的类对象,等等…这就像方法链。
子类中的代码片段如下
SessionClass userSession = (SessionClass)
getParentAbstractServiceMethod().getParentAbstractClassDomainFacade().getParentAbstractClassDomainObject(SessionClass.NAME);
如何模拟getParentAbstractServiceMethod()
方法,因为这是抽象类方法,我不能实例化它并调用。
最好的解决方案是遵循"优先组合而不是继承"原则,并将AbstractServiceClass转换为一个常规类,该类将当前扩展程序作为依赖项实现一个接口,该接口提供要调用的方法。
写完这些之后,不太明智的解决方案是使用Mockito创建抽象类的模拟:
AbstractParentClass cut= Mockito.mock(AbstractParentClass.class,Mockito.CALLS_REAL_METHODS);
Mockito.when(cut.getParentAbstractServiceMethod()).thenAnswer(...);
我认为你应该退后一步,看看你的设计。测试(抽象类的)子类有什么意义?这首先没有实现抽象方法。
我认为你应该这样做:
A)尽可能地测试你的基类;例如,通过创建一个只测试子类,以某种方式有意义地实现抽象方法B)确保你的"真正的"子类为你的抽象方法提供合理的实现。
提示:考虑而不是将抽象放入方法名中。它们只在父级是抽象的;