Даже если я полностью согласен с ответом iwein (
предпочитает композицию над наследованием
blockquote>), я допускаю, что наследование наследования несколько раз кажется естественным, и я не чувствую взлома или рефакторирования его только для модульного теста.
Итак, мое предложение:
/** * BaseService is now an asbtract class encapsulating * some common logic callable by child implementations */ abstract class BaseService { protected void commonSave() { // Put your common work here } abstract void save(); } public ChildService extends BaseService { public void save() { // Put your child specific work here // ... this.commonSave(); } }
И затем в модульном тесте:
ChildService childSrv = Mockito.mock(ChildService.class, Mockito.CALLS_REAL_METHODS); Mockito.doAnswer(new Answer<Void>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { // Put your mocked behavior of BaseService.commonSave() here return null; } }).when(childSrv).commonSave(); childSrv.save(); Mockito.verify(childSrv, Mockito.times(1)).commonSave(); // Put any other assertions to check child specific work is done